PowerShell按Department和Country字段对比两个CSV并导出差异文件
问题原因
你之前的代码将CSV作为纯文本逐行对比,会校验所有字段的内容差异,且没有利用CSV的结构化特性实现指定字段的对比逻辑。
实现代码
# 配置参数,按需修改 $primaryKey = "EmployeeID" # 替换为你CSV中唯一标识每条记录的字段名,比如员工ID $compareFields = @("Department", "Country") $test1Path = "C:\scripts\test1.csv" $test2Path = "C:\scripts\test2.csv" $outputPath = "C:\scripts\test3.csv" # 导入两个CSV文件 $test1Data = Import-Csv -Path $test1Path -Encoding UTF8 $test2Data = Import-Csv -Path $test2Path -Encoding UTF8 # 将test1转换为哈希表,主键为key,存储需要对比的两个字段值,方便快速查询 $test1Map = @{} foreach ($item in $test1Data) { $test1Map[$item.$primaryKey] = @{ Department = $item.Department Country = $item.Country } } # 筛选test2中符合变更条件的记录 $changedRecords = foreach ($item in $test2Data) { # 跳过test1中不存在的新增记录,若需要保留新增记录可删除这个if判断 if (-not $test1Map.ContainsKey($item.$primaryKey)) { continue } $refItem = $test1Map[$item.$primaryKey] # 只要两个字段有一个不一样就保留该记录 if ($item.Department -ne $refItem.Department -or $item.Country -ne $refItem.Country) { $item } } # 强制用分号作为分隔符的导出写法,和你原代码逻辑对齐 $changedRecords | ConvertTo-Csv -NoTypeInformation | ForEach-Object { $_ -replace ',', ';' } | Out-File -Path $outputPath -Encoding UTF8
逻辑说明
- 以指定的唯一主键匹配两个CSV中的同一条记录,避免跨记录比对
- 仅校验
Department和Country两个字段的内容差异 - 导出结果保留test2中变更记录的所有原始字段,符合预期输出要求
- 代码中已标注可自定义的配置项,可根据实际CSV字段名、编码等调整
内容的提问来源于stack exchange,提问作者Ruishoo
相关产品推荐
相关产品推荐

