首页 > 解决方案 > Powershell Compare-object 如果不同,则仅列出一个文件中的项目,而不是两者

问题描述

我删除了我原来的问题,因为我相信我有一种更有效的方式来运行我的脚本,因此我正在改变我的问题。

$scrubFileOneDelim = "|"
$scrubFileTwoDelim = "|"

$scrubFileOneBal = 2
$scrubFileTwoBal = 56
$scrubFileOneAcctNum = 0
$scrubFileTwoAcctNum = 0


    $ColumnsF1 = Get-Content $scrubFileOne | ForEach-Object{($_.split($scrubFileOneDelim)).Count} | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
    $ColumnsF2 = Get-Content $scrubFileTwo | ForEach-Object{($_.split($scrubFileTwoDelim)).Count} | Measure-Object -Maximum | Select-Object -ExpandProperty Maximum
    $useColumnsF1 = $ColumnsF1-1;
    $useColumnsF2 = $ColumnsF2-1;


$fileOne = import-csv "$scrubFileOne" -Delimiter "$scrubFileOneDelim" -Header (0..$useColumnsF1) | select -Property @{label="BALANCE";expression={$($_.$scrubFileOneBal)}},@{label="ACCTNUM";expression={$($_.$scrubFileOneAcctNum)}} 
$fileTwo = import-csv "$scrubFileTwo" -Delimiter "$scrubFileTwoDelim" -Header (0..$useColumnsF2) | select -Property @{label="BALANCE";expression={$($_.$scrubFileTwoBal)}},@{label="ACCTNUM";expression={$($_.$scrubFileTwoAcctNum)}} 

$hash = @{}
$hashTwo = @{}
$fileOne | foreach { $hash.add($_.ACCTNUM, $_.BALANCE) }
$fileTwo | foreach { $hashTwo.add($_.ACCTNUM, $_.BALANCE) }

在这个脚本中,我正在执行以下操作,计算标题以返回计数并在范围运算符中使用它,以便动态插入标题以供以后操作。然后我正在导入 2 个 CSV 文件。我正在获取这些 CSV 文件并将它们推送到自己的哈希表中。

只是为了了解我想从这里做什么......

CSV1(作为哈希表)如下所示:

Name                           Value                                                                                                                                                    
----                           -----                                                                                                                                                    
000000000001                   000000285+                                                                                                                                               
000000000002                   000031000+                                                                                                                                               
000000000003                   000004685+                                                                                                                                               
000000000004                   000025877+                                                                                                                                                                                                                                                                                          
000000000005                   000000001+                                                                                                                                               
000000000006                   000031000+                                                                                                                                               
000000000007                   000018137+                                                                                                                                               
000000000008                   000000000+             

CSV2(作为哈希表)如下所示:

Name                           Value                                                                                                                                                    
----                           -----                                                                                                                                                    
000000000001                   000008411+                                                                                                                                               
000000000003                   000018137+                                                                                                                                               
000000000007                   000042865+                                                                                                                                               
000000000008                   000009761+    

我想创建第三个哈希表。它将包含 CSV2 中的所有“NAME”项目,但我不希望 CSV2 中的“VALUE”,我希望它具有 CSV1 具有的“VALUE”。所以最终的结果会是这样的。

Name                           Value                                                                                                                                                    
----                           -----                                                                                                                                                    
000000000001                   000000285+                                                                                                                                               
000000000003                   000004685+                                                                                                                                               
000000000007                   000018137+                                                                                                                                               
000000000008                   000000000+  

最终,我希望将其导出为 csv。

我已经尝试过只做一个比较对象,而不是用下面的代码做哈希表,但我放弃了这样做,因为文件 1 可能有 100,000 个“帐户”,而文件 2 只有 200 个,结果我被列为接近 100,000 个我不想出现在结果中的帐户。他们有正确的余额,但我想要一个仅包含文件 2 中列出的帐户余额的文件。下面的代码实际上并不是我的问题的一部分,只是显示了我尝试过的一些东西。我只是认为现在使用哈希表更容易更快,所以我想走那条路。

#Find and Rename the BALANCE and ACCOUNT NUMBER columns in both files. 
$fileOne = import-csv "$scrubFileOne" -Delimiter "$scrubFileOneDelim" -Header (0..$useColumnsF1) | select -Property @{label="BALANCE";expression={$($_.$scrubFileOneBal)}},@{label="ACCT-NUM";expression={$($_.$scrubFileOneAcctNum)}}
$fileTwo = import-csv "$scrubFileTwo" -Delimiter "$scrubFileTwoDelim" -Header (0..$useColumnsF2) | select -Property @{label="BALANCE";expression={$($_.$scrubFileTwoBal)}},@{label="ACCT-NUM";expression={$($_.$scrubFileTwoAcctNum)}}

Compare-Object $fileOne $fileTwo -Property 'BALANCE','ACCTNUM' -IncludeEqual -PassThru | Where-Object{$_.sideIndicator -eq "<="} | select * -Exclude SideIndicator | export-csv -notype "C:\test\f1.txt"

标签: powershell

解决方案


您所追求的是过滤Compare-Object功能。这将仅显示结果的一侧。您需要在排除该属性之前放置它以使其正常工作。

| Where-Object{$_.sideIndicator -eq "<="} |

推荐阅读