powershell - 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"
解决方案
您所追求的是过滤Compare-Object
功能。这将仅显示结果的一侧。您需要在排除该属性之前放置它以使其正常工作。
| Where-Object{$_.sideIndicator -eq "<="} |
推荐阅读
- python - MacOS Catalina 10.15.5 Flask-Mysqldb pip install 报错
- makefile - 带有`ifeq`的Makefile测试特定文件
- azure - az storage account:“blob-service-properties”不在“az storage account”命令组中
- xcode - 简化 Xcode 中的 SwiftUI 预览
- javascript - 我们可以使用 iframe (HTML/JS) / Umap 的元素吗
- sql - 如何自动增加 id 并插入 2 行
- r - 如何将相关性显示为闪亮的数字输出?
- libraries - 如何将 jregex 库导入芭蕾舞女演员应用程序
- html - 无法将 CSS 添加到 HTML 代码以从 Mailkit 发送电子邮件
- r - bioconductor 和 R,在尝试检索基因序列时使用 getBM() 函数时出错