比较-对象与参考对象排序

问题描述 投票:0回答:1

我有两个文件(用于 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 行是新行?

powershell cnc
1个回答
0
投票

看来您真正要寻找的是两个集合按索引的对称差异,在这种情况下您可以只使用

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
© www.soinside.com 2019 - 2024. All rights reserved.