我有两个文件(用于 CNC 控制器)想要比较。我可以通过比较对象得到很好的结果:
$Diffs = Compare-Object -ReferenceObject $CFFC -DifferenceObject $CSFC -IncludeEqual
我遇到的问题是我想以与参考对象相同的文件顺序打印结果;更改内容和原始内容的摘要。比较对象结果按 SideIndicator 排序,这使得很难准确比较文件已更改的位置。
编辑1: 以下是输入和参考以及所需输出的示例。
...
Reference Object |Input Object
|
X-17.7936 Y-7.4805 C-273.65 |X-17.7936 Y-7.4805 C-273.65
X-17.9524 Y-4.9136 Z2.9619 C273.67 |X-17.9524 Y-4.9136 Z2.9619 C273.67
X-17.7969 Y-5.1084 Z2.9812 |X-17.7969 Y-5.1084 Z2.9812
G00 X-17.7795 Y-5.1073 Z3.981 |G00 X-17.7795 Y-5.1073 Z3.981
X9.8237 Y-10.8339 Z7.404 A-29.001 C274.152|X9.8277 Y-10.8339 Z7.404 A-29.001 C274.152
Z1.9632 |Z1.9672
G01 X9.7936 Y-10.3348 Z1.9674 |G01 X9.7966 Y-10.3348 Z1.9674
X9.6413 Y-8.0055 Z1.9682 A-29.0 C-274.149 |X9.6513 Y-8.0055 Z1.9682 A-29.0 C-274.149
G01 X7.6726 Y-4.7252 F200.0 |G01 X7.6726 Y-4.7252 F200.0
X7.8804 Y-8.0949 Z2.9991 A16.73 C29.503 |X7.8804 Y-8.0949 Z2.9991 A16.73 C29.503
X7.8782 Y-8.0951 Z2.9994 A16.791 C29.935 |X7.8782 Y-8.0951 Z2.9994 A16.791 C29.935
X7.876 Y-8.0953 Z2.9997 A16.854 C30.363 |X7.876 Y-8.0953 Z2.9997 A16.854 C30.363
X7.878 Y-8.0971 Z2.9988 A16.671 C-30.261 |X7.878 Y-8.0971 Z2.9988 A16.671 C-30.261
X7.8805 Y-8.0994 Z2.9977 A16.437 C-30.131 |X7.8805 Y-8.0994 Z2.9977 A16.437 C-30.131
...
所需输出:
X-17.7936 Y-7.4805 C-273.65 |
X-17.9524 Y-4.9136 Z2.9619 C273.67 |
X-17.7969 Y-5.1084 Z2.9812 |
G00 X-17.7795 Y-5.1073 Z3.981 |
X9.8277 Y-10.8339 Z7.404 A-29.001 C274.152|Changed
Z1.9672 |Changed
G01 X9.7966 Y-10.3348 Z1.9674 |Changed
X9.6513 Y-8.0055 Z1.9682 A-29.0 C-274.149 |Changed
G01 X7.6726 Y-4.7252 F200.0 |
X7.8804 Y-8.0949 Z2.9991 A16.73 C29.503 |
X7.8782 Y-8.0951 Z2.9994 A16.791 C29.935 |
X7.876 Y-8.0953 Z2.9997 A16.854 C30.363 |
X7.878 Y-8.0971 Z2.9988 A16.671 C-30.261 |
X7.8805 Y-8.0994 Z2.9977 A16.437 C-30.131 |
我可以通过 foreach 循环并创建一个新变量来完成此操作,但这需要非常长的时间。
$NewArr=@()
foreach($line in $csfc){
$ChangeStatus = ($Diffs -match [regex]::Escape($line)).SideIndicator
$LineStatus = "" | Select LINE, TYPE
if ($ChangeStatus -eq "=="){
$LineStatus.line = $line
$LineStatus.Type = $true
}
else{
$LineStatus.line = $line
$LineStatus.Type = $false
}
$newarr += $LineStatus
}
我想知道是否有更快、更稳健的方法来做到这一点
编辑 1:例如,如果某行在输入文件中重复 3 次,而在引用中仅重复两次,我如何发现第 3 行是新行?
看来您真正要寻找的是两个集合按索引的对称差异,在这种情况下您可以只使用
for
循环。假设我们将 2 个集合存储在 $referenceObject
和 $differenceObject
中,您的逻辑可能是:
for ($i = 0; $i -lt $referenceObject.Count; $i++) {
[pscustomobject]@{
Line = $referenceObject[$i]
Changed = $referenceObject[$i] -ne $differenceObject[$i]
}
}
给定样本数据,将输出:
Line Changed
---- -------
X-17.7936Y-7.4805C-273.65 False
X-17.9524Y-4.9136Z2.9619C273.67 False
X-17.7969Y-5.1084Z2.9812 False
G00X-17.7795Y-5.1073Z3.981 False
X9.8237Y-10.8339Z7.404A-29.001C274.152 True
Z1.9632 True
G01X9.7936Y-10.3348Z1.9674 True
X9.6413Y-8.0055Z1.9682A-29.0C-274.149 True
G01X7.6726Y-4.7252F200.0 False
X7.8804Y-8.0949Z2.9991A16.73C29.503 False
X7.8782Y-8.0951Z2.9994A16.791C29.935 False
X7.876Y-8.0953Z2.9997A16.854C30.363 False
X7.878Y-8.0971Z2.9988A16.671C-30.261 False
X7.8805Y-8.0994Z2.9977A16.437C-30.131 False