powershell比较两个文件并列出其列,并带有匹配/不匹配的侧面指示符

时间:2018-08-09 19:15:46

标签: powershell

我已经看到了Powershell脚本,我也想到了。我想添加的是另一列,它将显示侧面指示器比较器(“ ==”,“ <=”,“ =>”),并将它们分别命名为MATCH(if“ ==”)和MISMATCH(if “ <=”和“ =>”)。 有什么建议我该怎么做?

以下是脚本的链接(版权归Florent Courtay所有) How can i reorganise powershell's compare-object output?

$a = Compare-Object (Import-Csv 'C:\temp\f1.csv') (Import-Csv 'C:\temp\f2.csv') -property Header,Value 
    $a | Group-Object -Property Header | % { New-Object -TypeName psobject -Property @{Header=$_.name;newValue=$_.group[0].Value;oldValue=$_.group[1].Value}}

================================================ =======================

我想到的输出:

Header1             Old Value       New Value    STATUS
------              ---------       --------- -----------
String1             Value 1         Value 2      MATCH
String2             Value 3         Value 4      MATCH
String3             NA              Value 5      MISMATCH
String4             Value 6         NA           MISMATCH

1 个答案:

答案 0 :(得分:5)

这是一个独立的解决方案;只需将ConvertFrom-Csv调用替换为您的Import-Csv调用即可:

# Sample CSV input.
$csv1 = @'
Header,Value
a,1
b,2
c,3
'@

$csv2 = @'
Header,Value
a,1a
b,2
d,4
'@

Compare-Object (ConvertFrom-Csv $csv1) (ConvertFrom-Csv $csv2) -Property Header, Value |
  Group-Object Header | Sort-Object Name | ForEach-Object {
    $newValIndex, $oldValIndex = ((1, 0), (0, 1))[$_.Group[0].SideIndicator -eq '=>']
    [pscustomobject] @{
      Header = $_.Name
      OldValue = ('NA', $_.Group[$oldValIndex].Value)[$null -ne $_.Group[$oldValIndex].Value]
      NewValue = ('NA', $_.Group[$newValIndex].Value)[$null -ne $_.Group[$newValIndex].Value]
      Status = ('MISMATCH', 'MATCH')[$_.Group.Count -gt 1]
    }
  }

以上结果:

Header OldValue NewValue Status
------ -------- -------- ------
a      1        1a       MATCH
c      3        NA       MISMATCH
d      NA       4        MISMATCH

注意:

  • 假定每个给定的Header列值最多在每个输入文件中出现一次。

  • 需要使用Sort-Object Name调用来按Header值对输出进行排序。谢谢LotPings ,因为由于Compare-Object对其输出进行排序的方式(首先是右侧项目),由Group-Object创建的组的顺序会 not 自动反映第一个CSV的顺序标头值(d会出现在c之前)。