逐行比较2个CSV文件并仅打印新行

时间:2018-08-02 05:32:29

标签: powershell

我正在尝试比较2个CSV文件,即Old.csv和new.csv。我只想比较并打印与new.csv相比不在old.csv中的那些行。

我只想打印旧文件中没有的新文件。

$a = Import-Csv -Path C:\Users\subhatnagar\Desktop\old.csv 
$b = Import-Csv -Path C:\Users\subhatnagar\Desktop\new.csv

$Green = $b | Where {$a -notcontains $_} $green

2 个答案:

答案 0 :(得分:3)

鉴于您要查找两个.csv文件之间的新行,可以使用Compare-Object

$a = Import-Csv -Path C:\Users\subhatnagar\Desktop\old.csv 
$b = Import-Csv -Path C:\Users\subhatnagar\Desktop\new.csv

Compare-Object  -ReferenceObject $a -DifferenceObject $b | Select-Object -ExpandProperty InputObject | Export-Csv C:\Users\subhatnagar\Desktop\difference.csv -NoTypeInformation

命令说明:

Compare-Object -ReferenceObject $a -DifferenceObject $b-查找与对象之间的差异

Select-Object -ExpandProperty InputObject-仅显示不同的对象,而不显示Compare-Object的指示符

Export-Csv -NoTypeInformation-将管道值存储到不带类型头的.csv文件中。


如果只想将差异存储在变量中,只需删除Export-Csv部分:

$green = Compare-Object  -ReferenceObject $a -DifferenceObject $b | Select-Object -ExpandProperty InputObject

答案 1 :(得分:0)

如果您仅对“ 仅那些与new.csv 相比在old.csv中不存在的”感兴趣,而对对象和从中导入的对象不感兴趣.csv文件始终只包含字符串类型的属性。
您对问题的建议实际上可能对您有用,但是您需要将内容作为(使用Get-Content)而不是作为 objects (使用{ {3}})

$a = Get-Content -Path C:\Users\subhatnagar\Desktop\old.csv
$b = Get-Content -Path C:\Users\subhatnagar\Desktop\new.csv

$green = $b | Where {$a -notContains $_}
$green
  

请注意,此解决方案将比较,而不是对象,   这意味着如果交换列,new.csv文件中的所有行 all   被认为是不同的,如果您将输入作为   对象。