我有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
将其目的很好地链接到代码块)。 ++
对该索引进行递增)。 -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