如何在Powershell中比较2个CSV文件?

时间:2019-04-04 12:20:56

标签: powershell

一段时间以来,我一直在尝试编写powershell脚本来比较2个csv文件。在此论坛中发现了该脚本的一个草稿,但是它无法按照我想要的方式工作。我们每周都会导出SKU,我需要比较一下新文件中是否有任何新的SKUS。

我试图运行该脚本,它可以运行,但是仅适用于一小部分行。当我尝试将实际文件与5k行进行比较时,不幸的是失败了。输出几乎有3k行,这是胡说八道,因为我们没有在一周之内添加那么多行。

Clear-Host

$csv1 = Import-Csv "SKU_export_2019-04-01.csv" # NEW FILE
$csv2 = Import-Csv "SKU_export_2019-03-25.csv" # OLD FILE

$end     = $csv1.Count
$count   = 0
$diffobj = @()

do{
    if($csv1.SKU[$count] -ne $csv2.SKU[$count]){
       $diffobj += $csv1[$count]
    }

    $count++
}until($count -eq $end)

$diffobj | export-csv C:\xampp\htdocs\diff\difference.csv -NoTypeInformation

预期结果应该是新文件中所有差异的输出。

2 个答案:

答案 0 :(得分:0)

为什么不使用Compare-Object?

$diff = Compare-Object -ReferenceObject $csv1 -DifferenceObject $csv2

答案 1 :(得分:0)

您的脚本会比较每个订单索引的csv文件,如果更改了订单,则会出现不匹配的情况。

如其他人所建议,最好使用Compare-Object并明确使用SKU字段。

要仅获取由SideIndicator <=选择的新SKU,并包括csv中存在的任何其他字段/属性,也可以使用-PassThru参数。

要删除不可避免添加的SideIndicator,请使用带有-ExcludeProperty的Select-Object

添加了本周星期一的计算:

## Q:\Test\2019\04\04\SO_55515891.ps1
$MondayThisWeek = (Get-Date).Date.AddDays(-([int](Get-date).DayOfWeek)+1)
$MondayPrevWeek = $MondayThisWeek.AddDays(-7)

Clear-Host

$SKUthis = Import-Csv ("SKU_export_{0:yyyy\-MM\-dd}.csv" -f $MondayThisWeek) # NEW FILE
$SKUprev = Import-Csv ("SKU_export_{0:yyyy\-MM\-dd}.csv" -f $MondayPrevWeek) # OLD FILE

$SKUNew = Compare-Object -Ref $SKUthis -Diff $SKUprev -Property SKU -PassThru |
    Where-Object SideIndicator -eq '<=' | 
       Select-Object -Property * -ExcludeProperty SideIndicator

$SKUNew | Out-Gridview
$SKUNew | Export-Csv 'C:\xampp\htdocs\diff\difference.csv' -NoTypeInformation