【发布时间】:2021-07-08 21:03:10
【问题描述】:
我有一个问题,希望有人能够提供一些指导。 我有两个 csv 文件,File1 和 File2。
文件1:
value1,value2 A,10 B,30 C,45 D,39
文件2:
value1,value2 A,10 B,32 C,44 E,7 F,3
我正在寻找的是两件事。我需要检查文件之间是否删除了 value1 中的任何项目,和/或我需要检查相应的数字 value2 是否减少了。
首先,比较文件并找出在 File1 和 File2 中添加或删除了哪些行。如果我只比较 value1 项,那么使用 Compare-Object 就很容易了。
所以我第一次比较的结果,我会看到从 File1 到 File2,我会看到添加了 E 和 F 行,并且删除了 D 行。完美。
但是,这是我正在努力解决的下一部分。然后我需要比较每个文件中的 value2,并确定该数字是否减少(或可能增加或保持不变)。
棘手的部分是我不能只将 File1 中的第 4 行 value2 与 File2 中的第 4 行 value2 进行比较,因为一个用于 D,另一个用于 E。我不知道如何先匹配项目,然后基本上只取那些匹配的项目并比较那些项目的 value2?但是如果没有前一行匹配,会发生什么呢? (因为该行是新添加到file2或该行被删除并且只存在于file1中)
最后,我要提出的是所有已删除的 value1 的列表,以及自 File1 以来相应 value2 减少的所有 value1 的列表。我不关心增加或增加。
希望有人可以提供一些指导。 谢谢!
【问题讨论】:
-
一段时间以来,我一直在维护
Join-Object script/Join-Object Module(另请参阅:In Powershell, what's the best way to join two tables into one?)。对于您问题的第一部分,语法将类似于:$Csv1 |LeftJoin $Csv2 -on value1 -Name Old,New。对于问题的第二部分,您可以添加一个计算属性,例如:-Property *, @{Decreased = {$Right.value2 -lt $Left.value2}} -
或者只是:
$Csv1 |LeftJoin $Csv2 -on value1 -Name Old,New |Where {$_.Newvalue2 -lt $_.Oldvalue2}
标签: powershell