我已经看到了许多有关如何合并CSV文件的示例,但没有一个完全适合我要完成的工作。我有多个CSV文件,它们仅包含1行,但包含多列。每个CSV文件中的每个标头可能都不同,但是它们之间确实有相同的列名。我要完成的输出是将每个CSV文件中的所有标头(无论显示的值是否为null)添加到我的输出CSV文件的第1行。然后,我想将每个CSV的单行输出与输出CSV文件中的一行对齐,并相应地填充每列,并将那些未分配值的行留空。
CSV1:
Name,Date,Year,Country Bill,May 2018,1962,Canada
CSV2:
Profile,Prov,Size,Name 1,ON,14,Steve
CSV最终版本:
Name,Profile,Size,Date,Year,Prov,Country Bill,,,May 2018,1962,,Canada Steve,1,14,,,ON,,
答案 0 :(得分:0)
虽然还有另一种选择是使用Join-Object
在同一行中执行此操作,
您可以从PSGallery获取此cmdlet。
Find-Script join-object | Install-Script -Verbose -Scope CurrentUser
在下面工作,
(Join-Object -Left $CSV1 -Right $CSv2 -LeftJoinProperty Name -RightJoinProperty Name ), (Join-Object -Left $CSV2 -Right $CSV1 -LeftJoinProperty Name -RightJoinProperty Name -Type AllInLeft) | Export-Csv -Path c:\CombinedCsv.csv -NoTypeInformation
答案 1 :(得分:0)
导入,提取,构建和导出...
$files = 'csv1.csv','csv2.csv'
$outputcsv = 'final.csv'
# import all files
$csv = $files | Import-Csv
# extract columns from all files
$columns = $csv | ForEach {
$_ | Get-Member -MemberType NoteProperty | Select -ExpandProperty Name
}
# construct an object (from file 1) with all the columns
# this will build the initial csv
# (SilentlyContinue on members that already exist)
$columns | ForEach {
Add-Member -InputObject $csv[0] -Name $_ -MemberType NoteProperty -Value '' -ErrorAction SilentlyContinue
}
# export first object - and build all columns
$csv | Select -First 1 | Export-Csv -Path $outputcsv -NoTypeInformation
# export the rest
# -force is needed, because only 1st object has all the columns
$csv | Select -Skip 1 | Export-Csv -Path $outputcsv -NoTypeInformation -Force -Append
# show files
($files+$outputcsv) | ForEach { "$_`:"; (Get-Content -LiteralPath $_); '---' }
编辑:无需考虑出口问题。一行就足够了: $ csv | Export-Csv -Path $ outputcsv -NoTypeInformation