一段时间以来,我一直在尝试编写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
预期结果应该是新文件中所有差异的输出。
答案 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