我有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
答案 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
可以很好地将其目的与代码块相关联。)++
增加该索引)。-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