我已经看到了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
答案 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
之前)。