【问题标题】:Merge 2 csv files in powershell [duplicate]在powershell中合并2个csv文件[重复]
【发布时间】:2017-12-19 05:59:17
【问题描述】:

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

【问题讨论】:

  • 虽然标题建议重复,但问题的内容有所不同,因为它涉及基于索引加入 对象(而不是文件)。考虑$CSV1 | Join $CSV2 {$LeftIndex -eq $RightIndex),未记录的功能:stackoverflow.com/questions/1848821/…
  • 更新了Join-Object cmdlet 以通过省略-On 参数来更好地支持加入索引。实现上述的命令现在很简单:$CSV1 | Join $CSV2

标签: windows powershell csv merge add


【解决方案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 将 '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

【讨论】:

  • 太棒了! tks这么多:)
  • 但我认为您缺少文件名。我想将 $CSV1 | ForEach-Object..... 更改为 $CSV2 | ForEach-Object...... 。和-Value $CSV2[$i++].Class.....-Value $CSV1[$i++].Class....... 以符合我从文件A 到文件B 的问题:)。
  • 我已经编辑了答案,展示了你如何做到这一点。
  • 谢谢..你是最好的!
猜你喜欢
  • 2015-05-23
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 2019-10-30
  • 2020-09-18
  • 2020-09-23
相关资源
最近更新 更多