Как сравнить 2 файла CSV в Powershell? - PullRequest
0 голосов
/ 04 апреля 2019

Я пытался закодировать скрипт powershell для сравнения 2 CSV-файлов в течение некоторого времени. Нашел царапину скрипта на этом форуме, но он не работает так, как я хочу. Мы экспортируем наши SKU каждую неделю, и мне нужно сравнить, есть ли новые SKUS в новом файле.

Я попытался запустить скрипт, и он работает, но только для небольшого диапазона строк. Когда я попытался сравнить реальный файл с 5k строк, он, к сожалению, не удалось. В результате было получено почти 3 тыс. Строк, что не имеет смысла, поскольку мы не добавили столько строк за одну неделю.

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 голосов
/ 04 апреля 2019

Ваш скрипт сравнивает файлы csv по индексу заказа, если заказ изменился, у вас будет несоответствие.

Как советуют другие, лучше использовать Compare-Object и явно использовать поле SKU.

Чтобы получить только новые SKU, выберите SideIndicator <= и для включения любых других полей / свойств, присутствующих в csv, также используйте параметр -PassThru.

Чтобы удалить неизбежно добавленный SideIndicator, используйте aSelect-Object с -ExcludeProperty

Добавлен расчет этой недели понедельник:

## 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
0 голосов
/ 04 апреля 2019

Почему бы не использовать Compare-Object?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...