比较多个CSV列,并在PowerShell

时间:2018-09-11 12:02:14

标签: powershell csv compareobject

我有两个电子表格,它们的数据要进行比较,以突出显示匹配数据和不匹配数据,并带有一些“陷阱”-有些列我想忽略以进行比较(分数,测试名称),另一些列我想包括(文件名)和散列),并且我想传递双方(因此,即使不匹配,我也想执行“完全外部”查询)。这是我的示例数据:

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(比较目标):

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($ CSV1中的$ record)并检查了匹配的文件名,然后检查了哈希值,但是它处理大量数据的速度很慢(我怀疑是因为我的完整外部查询要求我使用新成员来扩展我的哈希表)所有列)。

我认为比较对象是一个很好的选择,但这似乎不允许我在passthru语句中包括双方,除非我遗漏了什么?

1 个答案:

答案 0 :(得分: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