【问题标题】:How to compare 2 CSV files in Powershell?如何在 Powershell 中比较 2 个 CSV 文件?
【发布时间】:2019-04-04 12:20:55
【问题描述】:

一段时间以来,我一直在尝试编写 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

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

【问题讨论】:

标签: powershell


【解决方案1】:

为什么不使用比较对象?

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

【讨论】:

  • 刚刚尝试执行此操作。这次我只有 60 行带有指示符
【解决方案2】:

您的脚本会比较每个订单索引的 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

【讨论】:

  • 感谢您的帮助。非常感谢。
  • 对了,能不能加个日志文件看一下执行是否有日期?我打算将此脚本添加到自动任务调度程序
  • 您可以在选择@{n='NewIn';e={$MondayThisWeek}}时添加一个带有日期的计算属性
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 2021-01-01
  • 2019-01-19
  • 1970-01-01
  • 2021-11-09
  • 2019-03-01
  • 1970-01-01
相关资源
最近更新 更多