比较.csv并仅添加具有更新值的行

时间:2018-07-26 03:17:30

标签: powershell

我有2个.csv文件,它们具有匹配的列,我试图将两者进行比较,并最终输出仅包含差异的.csv

corpold.csv是先前导入的文件。 corpnew.csv是新的导入文件。

我需要导出一个CSV,其中包含corpold.csv中不存在的所有项目,仅包含两个CSV中都存在的已更改项目,并且排除corpold.csv中但不包含{{1}中的任何行}。

corpnew.csv

1 个答案:

答案 0 :(得分:0)

这里有两项操作:找到差异并比较两个文件中都存在的对象。

比较对象并找到新的/已删除的条目

要比较对象,可以使用Compare-Object cmdlet,如下所示:

Compare-Object -ReferenceObject $reference -DifferenceObject $results -Property EMPID -IncludeEqual

这将为您提供EMPIDSideIndicator的列表,显示对象仅存在于第一(<=),仅第二(=>)还是同时存在( ==)。您可以按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
  }
}