在powershell中合并2个csv文件

我有2个CSV文件,我想添加一个新的列从文件A到文件B到一个新的文件。 Atm,它不取A的值。

文件A.csv

ID Name 1 Peter 2 Dalas 

文件B.CSV

 Class Math Physic 

新文件将是:

 ID Name Class 1 Peter Math 2 Dalas Physics 

这两个文件具有相同的行数。

下面我使用的代码,我想现在如何从文件A的值,并把它放在文件B.

 $CSV1 = Import-Csv ".\A.csv" $CSV2 = Import-Csv ".\B.csv" $CSV1 | ForEach-Object { $Value= $_ $CSV2 | Select-Object *, @{Name='Information';Expression={ $Value}} } | Export-Csv "C.csv" -NoTypeInformation 

假设你的两个CSV文件是正确对齐的(例如,你想合并基于行号的数据,而不是通过任何其他键链接),我建议如下:

 $CSV1 = Import-Csv ".\A.csv" $CSV2 = Import-Csv ".\B.csv" $CSV1 | ForEach-Object -Begin {$i = 0} { $_ | Add-Member -MemberType NoteProperty -Name 'Class' -Value $CSV2[$i++].Class -PassThru } | Export-Csv "C.csv" -NoTypeInformation 

说明:

  • 使用-Begin脚本块将计数器设置为0(可以在ForEach-Object之前执行此操作,但使用-Begin将其目的很好地链接到代码块)。
  • 使用Add-Member将'Class'属性添加到CSV1中的每一行,使用CSV2中行的数组索引(并使用++对该索引进行递增)。
  • 使用-PassThru开关将对象返回到管道。

如果你想这样做(B> A),你可以采取同样的方法,但需要这样做:

 $CSV2 | ForEach-Object -Begin {$i = 0} { $CSV1[$i++] | Add-Member -MemberType NoteProperty -Name 'Class' -Value $_.Class -PassThru } | Export-Csv "C.csv" -NoTypeInformation 

我真的很惊讶$_.Class仍然作为一个新的管道的另一端,但似乎。

你也可以使用一个像你最初计划的计算表达式,但是你需要使用一个额外的变量来存储$Class因为额外的管道:

 $CSV2 | ForEach-Object -Begin {$i = 0} { $Class = $_.Class $CSV1[$i++] | Select @{Name='Class';Expression={$Class}},* } | Export-Csv "C.csv" -NoTypeInformation