Сравните несколько столбцов 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
Другие вопросы по тегам