将CSV文件的差异提取到单独的文件中

时间:2017-09-06 13:57:01

标签: powershell csv compare

我有一个带有分类数据的CSV文件(带标题)。该文件每天更新​​一次。我需要找到这些文件(旧文件和新文件)的差异,并将它们提取到一个单独的文件中。

例如:在旧文件中可能有“18,50”的价格,现在它是“17,90”的更新版本。该脚本现在应该将此行提取到一个新文件中。

到目前为止,我能够导入两个CSV文件(通过Import-Csv),但我目前的解决方案是按findstr比较每一行。

问题是:

  • 在10个案例中,有9个字符串太长而无法比较。
  • 如果要插入新行怎么办?如果没有在文件末尾插入行,我想比较将不再有效。

我目前的代码是:

foreach ($oldData in (Import-Csv $PSScriptRoot\old.csv -Delimiter ";" -Encoding "default")) {
    foreach ($newData in (Import-Csv $PSScriptRoot\new.csv -Delimiter ";" -Encoding "default")) {
        findstr.exe /v /c:$oldData $newData > $PSScriptRoot\diff.txt
    }
}

2 个答案:

答案 0 :(得分:1)

将两个文件读入单独的变量并使用Compare-Object进行比较:

$fields = 'idArtikel', 'Preis', ...

$csv1 = Import-Csv $PSScriptRoot\old.csv -Delimiter ';'
$csv2 = Import-Csv $PSScriptRoot\new.csv -Delimiter ';'

Compare-Object -ReferenceObject $csv1 -DifferenceObject $csv2 -Property $fields -PassThru | Where-Object {
    $_.SideIndicator -eq '=>'
} | Select-Object $fields | Export-Csv 'C:\path\to\diff.csv' -Delimiter ';'

答案 1 :(得分:0)

$csv1 | Join $csv2 idArtikel -Merge {$Right.$_} | Export-CSV 'C:\path\to\diff.csv' -Delimiter ';'

有关JoinJoin-Object)的详细信息,请参阅:https://stackoverflow.com/a/45483110/1701026