大家好我正在尝试将多个具有相同列数的csv文件合并到一个文件中,并带有一个显示文件名的额外列名,以下是我想要的示例:
file01.csv
c01,c02,c03,c04,c05
A,1,4,2,3
B,5,4,6,4
file02.csv
c01,c02,c03,c04,c05
C,2,4,5,6
D,2,4,1,3
预期结果。
merged.csv
c01,c02,c03,c04,c05,Name
A,1,4,2,3,file01.csv
B,5,4,6,4,file01.csv
C,2,4,5,6,file02.csv
D,2,4,1,3,file02.csv
我试过这段代码。它合并了所有文件,但它没有显示文件名:
Get-ChildItem "*.csv" | % { Import-csv -header c01,c02,c03,c04,c05 $_.FullName | select-object c01,c02,c03,c04,c05,@{e="$_.basename";n="Name" | Export-Csv Merged.csv }
答案 0 :(得分:1)
您的文件和输出不是真正的CSV,这是您遇到问题的地方。列在那里,但有一个标题必须处理。让我们使用Get-Content
来获取文件数据并忽略第一行。然后我们可以将剩余数据转换为CSV对象。对于每一行,我们可以附加一个值,该值包含源自的文件名。收集所有更新数据并在输出前加上" merged.csv"
$path = "d:\temp"
$mergedData = Get-ChildItem $path -Filter "*.csv" | ForEach-Object{
$file = $_
# Get the file data
Get-Content $file.FullName |
# Skip the filename
Select-Object -Skip 1 |
# Now we can get CSV object in the same way that Import-CSV would generate
ConvertFrom-Csv | ForEach-Object{
# Add the current filename as a column
$_ | Add-Member -MemberType NoteProperty -Name "Name" -Value $file.Name -PassThru
}
# Convert back into raw, quoted data
} | ConvertTo-Csv -NoTypeInformation
# Prefix the header before the compiled data
"merged.csv",$mergedData | Set-Content "$path\merged.csv"