我删除了最初的问题,因为我相信我有一种更高效的方式来运行脚本,因此我正在更改问题。
$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+
我只是通过做一个比较对象而没有用下面的代码来做哈希表,但是我放弃了这样做,因为文件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"
答案 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]@{}
。