在powershell中合并2个csv文件

时间:2017-07-14 08:02:28

标签: windows powershell csv merge add

我有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

1 个答案:

答案 0 :(得分:1)

假设您的两个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添加&#39; Class&#39; 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