Как я могу использовать Powershell для сравнения двух файлов CSV, а затем обновить один из файлов CSV с результатами сравнения - PullRequest
0 голосов
/ 08 января 2020

Я бы хотел сравнить два CSV-файла: «master» и «input», а затем обновить «master» файл, чтобы он содержал различия

«master» файл изначально будет содержать некоторые данные .. как это:

A,B,C
5,9,cat
1,2,dog
2,8,rabbit
8,8,mouse
6,2,duck

Файл 'input' может содержать записи из основного файла: UPDATED , NO CHANGE или ДОБАВЛЕНО :

A,B,C
1,2,otter
8,8,mouse
5,3,tiger

Теперь мастер-файл и входной файл сравниваются и вот результаты:

ОБНОВЛЕНО

Существует разница между мастером и входом для 1,2, который содержит главный файл: 1,2, dog входной файл содержит 1,2, выдра , потребуется обновить мастер-файл

БЕЗ ИЗМЕНЕНИЯ

Мастер И входной файл содержит: 8,8, мышь, поэтому ничего не делается

ДОБАВЛЕНО

Входной файл содержит новую запись 5,3, тигр , поэтому мастер файл будут добавлены с этими новыми данными

РЕЗУЛЬТАТ ФАЙЛА МАСТЕРА

A,B,C
5,9,cat
1,2,otter
2,8,rabbit
8,8,mouse
6,2,duck
5,3,tiger

Вот код, который у меня есть:

$apples = Get-Content $Input
$oranges = Get-Content $Master

# this will generate the file that contains ONLY the CHANGED or new entries that must be recorded
Compare-Object $apples $oranges -PassThru | Where-Object{ $_.SideIndicator -eq "<=" } | Out-File $OutFile

# this will generate the file that contains the old entries that need to be replaced with the new ones
Compare-Object $apples $oranges -PassThru | Where-Object{ $_.SideIndicator -eq "=>" } | Out-File $FixUp

Вот где я застрял ... я могу получить 'fixup' и 'старые' записи ... но я не знаю, как использовать их для обновления главного файла?

Я думал о цикле через файлы ... но потом подумал ... Как соотнести мастер с исправлением изменений:

    $csv = Import-Csv $FixUp
    #This works fine
    for($i = 0; $i -lt @($csv).Length; $i++){

        #$find = how do i get old csv value from master file ???
        #$replace = $csv
        #(Get-Content $file).replace($find, $replace) | Set-Content $file            
    } 

1 Ответ

1 голос
/ 08 января 2020

Если вы рассматриваете свои входные данные как данные CSV, вы можете выбрать, какие атрибуты Compare-Object следует использовать для сравнения.

$Apples = @'
A,B,C
5,9,cat
1,2,dog
2,8,rabbit
8,8,mouse
6,2,duck
'@ | 
ConvertFrom-Csv
$Oranges = @'
A,B,C
1,2,otter
8,8,mouse
5,3,tiger
'@ | 
ConvertFrom-Csv

Compare-Object -ReferenceObject $Oranges -DifferenceObject $Apples -Property A, B -IncludeEqual -PassThru

В результате вы получите:

A B C      SideIndicator
- - -      -------------
1 2 otter  ==
8 8 mouse  ==
5 9 cat    =>
2 8 rabbit =>
6 2 duck   =>
5 3 tiger  <=
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...