PowerShell基于共同PC列合并CSV并更新对应行数据的实现方法
PowerShell 按公共PC字段合并两个CSV文件
原脚本错误原因
- 循环逻辑错误:遍历第二个CSV每行时全量覆盖导出原文件,最终仅会保留最后一次循环的赋值结果,导致所有行都被填充为第二个CSV最后一行的内容
- 匹配逻辑错误:直接对整个CSV数组的PC列做等值判断,无法实现逐行匹配对应PC的记录
- 操作风险:直接修改原文件容易丢失原始数据,建议先导出到新文件验证无误后再替换
正确实现方案
我们将第二个CSV转换为哈希表做快速匹配,遍历第一个CSV逐行赋值,最后统一导出结果:
# 配置路径 $initialCsvPath = "\\ADSERVER\Inventaire\InventairePCAD.csv" $prestaCsvFolder = "\\ADSERVER\Inventaire\" # 导出到新文件避免覆盖原始数据,验证无误后可手动替换原文件 $exportPath = "\\ADSERVER\Inventaire\InventairePCAD_Merged.csv" # 导入两个CSV文件 $CSVInitiale = Import-Csv -Path $initialCsvPath -Delimiter ',' $allPrestaCsvPaths = (Get-ChildItem -Path $prestaCsvFolder -Filter 'Presta*.csv').FullName $PrestaCSV = Import-Csv -Path $allPrestaCsvPaths -Delimiter ',' # 构建PC为键的哈希表,用于快速匹配 $prestaMatchMap = @{} foreach ($prestaItem in $PrestaCSV) { $prestaMatchMap[$prestaItem.PC] = @{ Nom_du_prestataire = $prestaItem.Nom_du_prestataire Date_de_Migration = $prestaItem.Date_de_Migration } } # 逐行匹配合并字段 $mergedResult = $CSVInitiale | ForEach-Object { $nomVal = "" $dateVal = "" # 匹配到PC则赋值,否则留空 if ($prestaMatchMap.ContainsKey($_.PC)) { $nomVal = $prestaMatchMap[$_.PC].Nom_du_prestataire $dateVal = $prestaMatchMap[$_.PC].Date_de_Migration } # 输出合并后的行 $_ | Select-Object *, @{Name = "Nom_du_prestataire"; Expression = {$nomVal}}, @{Name = "Date_de_Migration"; Expression = {$dateVal}} } # 导出合并结果 $mergedResult | Export-Csv -Path $exportPath -Delimiter ',' -NoTypeInformation -Encoding UTF8
注意事项
- 代码默认导出到新文件
InventairePCAD_Merged.csv,打开确认内容符合预期后,再替换原文件即可 - 新增
-Encoding UTF8参数避免导出后中文/特殊字符乱码
内容的提问来源于stack exchange,提问作者Adha
相关产品推荐
相关产品推荐

