我有2个.csv文件,它们具有匹配的列,我试图将两者进行比较,并最终输出仅包含差异的.csv
corpold.csv
是先前导入的文件。
corpnew.csv
是新的导入文件。
我需要导出一个CSV,其中包含corpold.csv
中不存在的所有项目,仅包含两个CSV中都存在的已更改项目,并且排除corpold.csv
中但不包含{{1}中的任何行}。
corpnew.csv
答案 0 :(得分:0)
这里有两项操作:找到差异并比较两个文件中都存在的对象。
要比较对象,可以使用Compare-Object
cmdlet,如下所示:
Compare-Object -ReferenceObject $reference -DifferenceObject $results -Property EMPID -IncludeEqual
这将为您提供EMPID
和SideIndicator
的列表,显示对象仅存在于第一(<=
),仅第二(=>
)还是同时存在( ==
)。您可以按SideIndicator
进行过滤,然后进行相应处理。
另一种方法是像这样使用Where-Object
:
$reference | Where-Object empid -NotIn $results.empid
$reference | Where-Object empid -In $results.empid
$results | Where-Object empid -NotIn $reference.empid
第一个只给您第一个文件中的条目,第二个都在两个文件中都存在,最后一个只给您第二个文件中的条目。
您基本上要做的是迭代所有条目,然后检查是否有任何列被更改。如果是,请将其添加到$changedEntries
。
脚本示例:
$IDsInBoth = $results | Where-Object empid -In $reference.empid | Select-Object -ExpandProperty EMPID
$AllProperties = $results | Get-Member | Where-Object MemberType -eq "NoteProperty" | Select-Object -ExpandProperty Name
$changedEntries = @()
$IDsInBoth | ForEach-Object {
$changed = $false
$newEntry = $results | Where-Object EMPID -eq $_
$oldEntry = $reference | Where-Object EMPID -eq $_
foreach ($p in $AllProperties) {
if ($oldEntry."$p" -ne $newEntry."$p") {
$changed = $true
}
}
if ($changed) {
$changedEntries += $newEntry
}
}