Powershell,使用FileNames合并CSV文件

时间:2015-12-14 00:36:53

标签: csv powershell merge

大家好我正在尝试将多个具有相同列数的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 }

1 个答案:

答案 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"