比较PSCustomObjects的所有属性(Excel工作表数据)

loading...


0

我正在开发一个PowerShell脚本,用于从2个单独的Excel工作表中导入数据,比较这些工作表的所有属性,并使用此输出导出新的Excel工作表 . 此脚本的目的是将更新的Excel工作表与先前版本进行比较,并找出已更改的内容,已添加的内容以及可能已删除的内容 .

我一直在使用Import-Excel模块来处理第一部分,而 Compare-Object 用于数据比较 . 据我所知 Import-Excel 将Excel数据导入 System.Object ,它是PSCustomObjects的哈希表 . 每个PSCustomObject对应于Excel工作表中的一行 .

我正在运行以下代码:

$global:InputdataA = Import-Excel -Path $InputA -WorkSheetname $InputSheetA
$global:InputdataB = Import-Excel -Path $InputB -WorkSheetname $InputSheetB
$global:ReferenceObject = $InputdataA
$global:DifferenceObject = $InputdataB

$global:InputdataHeadersA = $InputdataA[0].psobject.properties.name
$global:InputdataHeadersB = $InputdataB[0].psobject.properties.name

$props = $InputdataHeadersA
$props += $InputdataHeadersB
$props = $props | Select -Unique

$compareResult = Compare-Object -ReferenceObject $ReferenceObject -DifferenceObject $DifferenceObject -Property $props -PassThru -CaseSensitive

我正在使用2个excel文件进行测试:

Personnel_16_12_2018 - small2.xlsx(旧版本)Personnel_28_11_2018 - small2.xlsx(带有更改和添加的新版本)

这些文件可以在这里下载:

https://ufile.io/bmstu https://ufile.io/3z62x


我希望看到的输出只有7个已经更改/添加的条目,来自差异对象的数据(excel表的新版本)这将代表最新和“正确”的数据 .

目前,我从compare-object获得一个输出,包含7个条目和6个已从参考对象(包括side-indicator)更改的条目 .

是否可以使compare-object仅返回更改,或者之后是否必须处理输出?

loading...

1回答

  • 0

    根据您的附加信息和示例文件,您可以尝试这样的事情:

    $oldFile = Import-Excel ".\personnel_28_11_2018---small2.xlsx"
    $newFile = Import-Excel ".\personnel_16_12_2018---small2.xlsx"
    
    $properties = "TRIAL_PK", "TRIALCOUNTRY_PK", "TRIALSSITE_PK", "ASSIGNMENT_LVL", "ROLE", "INT_EXT", "START_DATA", "END_DATE", "PERSONNELL_PK", "TITLE", "LAST_NAME", "FIRST_NAME", "ORGANIZATION_NAME"
    
    $result = Compare-Object -ReferenceObject $oldFile -DifferenceObject $newFile -Property $properties -PassThru -CaseSensitive | Where-Object {$_.SideIndicator -eq "=>"}
    
    $result | Select-Object $properties | Export-Excel ".\changed.xlsx"
    
评论

暂时没有评论!