所以我一整天都在攻击互联网,寻找一种将多个CSV文件合并的方法。无论我查找了哪种30多种PowerShell方法,我都遇到了问题。
我正在尝试以“完全连接”方式将多个CSV文件合并为一个。我需要从所有CSV文件中组合所有行和所有列,但要注意的是,我想根据共同标识符组合行。这个讨论:“通过共享列合并两个CSV文件”,正好做到了我想做的事情,但有两个例外。首先,它只适用于两个CSV文件,其次,如果两个CSV文件都不包含“名称”,它会删除行。即使它不在两个CSV文件中,我也想保留该行,并在另一个CSV中没有数据的地方创建空白条目。
CSV1.csv
Name,Attrib1,Attrib2
VM1,111,True
VM2,222,False
CSV2.csv
Name,AttribA,Attrib1
VM1,AAA,111
VM3,CCC,333
CSV3.csv
Name,Attrib2,AttribB
VM2,False,YYY
VM3,True,ZZZ
期望的合并结果:
Name,Attrib1,Attrib2,AttribA,AttribB
VM1,111,True,AAA,
VM2,222,False,,YYY
VM3,333,True,CCC,ZZZ
有人对这个有任何想法吗?如果您需要更多信息,请告诉我。
更新:这是我目前在SQLite shell中尝试的代码:
$db = Join-Path $env:TEMP 'temp.db'
$dir = "C:\Users\UserName\Downloads\CSV Combination"
$outfile = Join-Path $dir 'combined.csv'
@"
CREATE TABLE a (Name varchar(20),OS varchar(20),IP varchar(20),Contact varchar(20),Application varchar(20));
CREATE TABLE b (Name varchar(20));
CREATE TABLE c (Name varchar(20),Quiesce varchar(20));
CREATE TABLE d (Name varchar(20),NoQuiesce varchar(20));
.mode csv
.import '$((Join-Path $dir csv1.csv) -replace '\\', '\\')' a
.import '$((Join-Path $dir csv2.csv) -replace '\\', '\\')' b
.import '$((Join-Path $dir csv3.csv) -replace '\\', '\\')' c
.import '$((Join-Path $dir csv4.csv) -replace '\\', '\\')' d
SELECT a.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM a
LEFT OUTER JOIN b ON a.Name = b.Name
LEFT OUTER JOIN c ON a.Name = c.Name
LEFT OUTER JOIN d ON a.Name = d.Name
UNION
SELECT b.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM b
LEFT OUTER JOIN a ON a.Name = b.Name
LEFT OUTER JOIN c ON b.Name = c.Name
LEFT OUTER JOIN d ON c.Name = d.Name
UNION
SELECT c.Name,a.OS,a.IP,a.Contact,a.Application,c.Quiesce,d.NoQuiesce
FROM c
LEFT OUTER JOIN a ON a.Name = c.Name
LEFT OUTER JOIN b ON b.Name = c.Name
LEFT OUTER JOIN d ON c.Name = d.Name;
"@ | filesystem::"C:\Users\UserName\Downloads\CSV Combination\sqlite3.exe" $db >$outfile
Remove-Item $db
目前返回以下错误信息:
sqlite3.exe:错误:C:\ Users \ brandon.andritsch \ Downloads \ CSV Combination \ csv1.csv第1行:期望5列数据,但找到6列
[Join-Object] cmdlet
来完成这个任务:Import-CSV .\CSV1.csv | Join (Import-CSV .\CSV2.csv) Hosts {$Right.$_} | Join (Import-CSV .\CSV3.csv) Hosts {$Right.$_} | Export-CSV .\combined.csv
- iRon