Сравните несколько столбцов CSV и верните полные данные из обоих в PowerShell
У меня есть две таблицы с данными, которые я хочу сравнить, чтобы выделить совпадающие и несоответствующие данные с несколькими "хитами" - некоторые столбцы, которые я хочу игнорировать для сравнения (оценка, имя теста), другие я хочу включить (имя файла и хэш) и я хочу передать обе стороны (поэтому, даже если он не совпадает, я хочу сделать "полный внешний" запрос). Вот мой пример данных:
CSV1 (источник):
FileName, ServerName, TestName, Hash, Score
C:\temp, ServerA, TestA, 12345, 100
C:\temp1, ServerA, TestA, 12345, 100
C:\temp2, ServerA, TestA, 12345, 5
C:\temp3, ServerA, TestA, 8888, 100
C:\temp5, serverA, TestB, 9999, 100
CSV2 (ComparisonTarget):
FileName, ServerName, TestName, Hash, Score
C:\temp, ServerB, TestA, 12345, 100
C:\temp1, ServerB, TestA, 5555, 100
C:\temp3, ServerB, TestA, 8888, 100
C:\temp5, ServerB, TestB, 9999, 100
C:\temp7, ServerB, TestB, 5678, 22
Я хочу посмотреть, совпадают ли имена файлов и хэши - например, C:\temp и C:\temp5 и вернут все столбцы с боковым индикатором - например,
Выход CSV
SourceFileName, SourceServer,DestinationServer, ..., Match, Score
C:\temp, ServerA, ServerB, True, 100
C:\temp3, ServerA, ServerB, True, 8888
C:\temp1, ServerA, ServerB, False, 100
C:\temp2, ServerA, N/A, False, 5
C:\temp7, N/A, ServerB, False, 22
Я использовал ForEach($record в $CSV1) и проверил на совпадение имен файлов, затем хэшей, но это медленно с большими объемами данных (я подозреваю, потому что мой полный внешний запрос требует, чтобы я расширил свою хеш-таблицу новыми членами для всех столбцов),
Я подумала, что Compare-object подойдет, но это не позволяет мне включать обе стороны в промежуточный оператор, если я что-то упустил?
1 ответ
Используя это Join-Object
:
$CSV1 | FullJoin $CSV2 -On FileName -Property @{
SourceFileName = {If ($Left.FileName) {$Left.FileName} Else {$Right.FileName}}
SourceServer = {$Left.ServerName}
DestinationServer = {$Right.ServerName}
Match = {$Left.Hash -eq $Right.Hash}
Score = {If ($Left.$_ -gt $Right.$_) {$Left.$_} Else {$Right.$_}}
} |Format-Table
Match DestinationServer Score SourceFileName SourceServer
----- ----------------- ----- -------------- ------------
True ServerB 100 C:\temp ServerA
False ServerB 100 C:\temp1 ServerA
False 5 C:\temp2 ServerA
True ServerB 100 C:\temp3 ServerA
True ServerB 100 C:\temp5 serverA
False ServerB 22 C:\temp7