所以我整天都在网上搜索,寻找一种方法来合并多个CSV文件。我一直遇到一个问题,无论我查阅了30多种PowerShell方法中的哪一种。
我尝试将多个CSV文件合并为一个,本质上是“完全连接”风格。我需要将所有CSV的所有行和所有列组合在一起,但我希望基于一个公共标识符组合行。本次讨论:“Merging two CSV files by shared column”,做的正是我想做的,但有两个例外。首先,它只为两个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\布兰登.andritsch\Downloads\CSV Combination\csv1.csv行1:预期有5列数据,但找到了6列
3条答案
按热度按时间nzk0hqpo1#
我创建了一个名为
Merge-Object
(别名Merge
)的Join-Object
代理命令,因为它经常使用与SQL MERGE语句稍微类似的合并对象。Merge-Object
命令的默认参数设置为:JoinType = 'Full'
和Property= {{If ($Null -ne $RightIndex) {$Right.$_} Else {$Left.$_}}}}
。这意味着所有左侧对象都将使用右侧属性值进行更新,并且左侧对象列表中不存在的右侧对象将添加到结果中:结果:
3yhwsihp2#
你可以使用一个很棒的命令行工具:米勒(http://johnkerl.org/miller/doc/)。
与
你有
作为输入,我使用了这3个文件
Win exe https://github.com/johnkerl/miller/releases
关于命令的一些注意事项:
reshape -r "^A" -o item,value
,将输入的CSV从宽转换为长,将其应用于名称以“A”开头的所有字段;reshape -s item,value
,将先前的输出从长转换为宽;unsparsify --fill-with ""
,用于管理所有输入记录上的字段名称。对于在给定记录中不存在但在其他记录中存在的字段名,填写值“"。oprakyz73#
试试这个:
您需要使用SQLite命令行shell来完成此操作。