Я бы хотел сравнить два 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
}