这个问题在这里已经有了答案:
CMD or Powershell command to combine (merge) corresponding lines from two files
(6 个回答)
4年前关闭。
我有 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 的脚本 block (您可以在 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
关于windows - 在powershell中合并2个csv文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097794/