Сравните несколько столбцов CSV и верните полные данные из обоих в PowerShell - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть две таблицы с данными, которые я хочу сравнить, чтобы выделить совпадающие и несоответствующие данные с несколькими «хитами» - некоторые столбцы, которые я хочу игнорировать для сравнения (оценка, имя теста), другие я хочу включить (Имя файлаи хэш), и я хочу передать обе стороны (поэтому, даже если он не совпадает, я хочу сделать «полный внешний» запрос).Вот мои примеры данных:

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 Ответ

0 голосов
/ 11 сентября 2018

Используя это 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
...