使用PowerShell对比两个CSV文件时Compare-Object无法返回全量数据
问题根因
你调用Compare-Object时仅通过-Property参数指定了对比Project No.这一个字段,所以返回的对比结果对象$R仅包含Project No.和SideIndicator两个属性,不存在其他CSV原有的字段,读取不存在的属性自然返回空值,和CSV文件本身无关,是用法逻辑问题。
修复方案
你需要在匹配到Project No.相等的记录后,从存储完整数据的$file1中检索对应记录的全量字段即可,参考修改后的代码:
# 导入两份CSV文件 $file1 = Import-Csv -Path "C:\scriptfolder\projects.csv" $file2 = Import-Csv -Path "C:\scriptfolder\archive.csv" # 按Project No.对比,保留匹配项 $compareResults = Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -Property 'Project No.' -IncludeEqual $outputArray = @() foreach ($result in $compareResults) { # 仅处理两份文件都存在的Project No.记录 if ($result.SideIndicator -eq "==") { # 从file1中匹配对应Project No.的完整记录 $matchedRecord = $file1 | Where-Object { $_.'Project No.' -eq $result.'Project No.' } | Select-Object -First 1 $outputObject = [PSCustomObject][Ordered] @{ ProjectNumber = $matchedRecord.'Project No.' ProjectName = $matchedRecord.'Project Name' ProjectManager = $matchedRecord.ProjMgr FirstName = $matchedRecord.FirstName LastName = $matchedRecord.LastName "Compare indicator" = $result.SideIndicator } $outputArray += $outputObject } } # 输出结果 $outputArray
性能优化建议(可选)
如果CSV数据量较大,逐行使用Where-Object查找效率较低,可以提前将$file1按Project No.转为哈希表索引,查找效率会大幅提升:
# 提前构建file1的Project No.索引哈希表 $file1Index = @{} foreach ($record in $file1) { $file1Index[$record.'Project No.'] = $record } # 循环中直接从哈希表取数据,替换原来的Where-Object逻辑 $matchedRecord = $file1Index[$result.'Project No.']
内容的提问来源于stack exchange,提问作者nosupport2020
相关产品推荐
相关产品推荐

