Powershell比较对象IF如果不同,则仅列出一个文件中的项目,而不是两个

时间:2019-06-27 23:25:22

标签: powershell

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

$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"

2 个答案:

答案 0 :(得分:1)

您要过滤的是Compare-Object函数。这将仅显示结果的一侧。您需要先放置此对象,然后再排除该属性,以使其正常工作。

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

答案 1 :(得分:0)

假设您具有以下哈希表:

 $hash = @{
    '000000000001' = '000000285+';
    '000000000002' = '000031000+';
    '000000000003' = '000004685+';
    '000000000004' = '000025877+';
    '000000000005' = '000000001+';
    '000000000006' = '000031000+';
    '000000000007' = '000018137+';
    '000000000008' = '000000000+';
}

$hashTwo = @{
    '000000000001' = '000008411+';
    '000000000003' = '000018137+';
    '000000000007' = '000042865+';
    '000000000008' = '000009761+';
}

您可以通过迭代第二个哈希表中的键,然后将这些键分配给第一个哈希表中的值来创建第三个哈希表。

$hashThree = @{}
ForEach ($key In $hashTwo.Keys) {
    $hashThree["$key"] = $hash["$key"]
}
$hashThree

$hashThree的输出是:

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

如果要维护数据的顺序(并且正在使用PowerShell 6 Core),则可以在创建哈希表时使用[ordered]@{}