You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 02:48:05