PowerShell跨CSV比对列值并新增匹配列的实现方法
CSV列值关联匹配PowerShell实现
优化后可直接运行的脚本
# 导入两份源CSV文件 $report = Import-Csv -Path "C:\report.csv" -Encoding UTF8 $reference = Import-Csv -Path "C:\team.csv" -Encoding UTF8 # 逐行处理收集匹配结果 $output = foreach ($line in $report) { # 匹配规则:setup列以main值开头,或responsible列等于main值 $match = $reference | Where-Object { $line.Setup -like "$($_.Main)*" -or $line.Responsible -eq $_.Main } | Select-Object -First 1 # 无匹配项直接跳过当前行,不写入结果 if (-not $match) { continue } # 构造输出行,保留原有三列+新增team列 [PSCustomObject]@{ type = $line.type setup = $line.setup responsible = $line.responsible team = $match.Team } } # 一次性导出所有结果,避免逐行追加的性能损耗 $output | Export-Csv -Path "C:\Output.csv" -NoTypeInformation -Encoding UTF8
对应问题解决说明
- 无匹配行过滤:脚本检测到当前行在参考表中找不到对应匹配项时,直接通过
continue跳过,不会写入最终输出文件 - 匹配逻辑适配:setup列采用前缀匹配规则,只要setup值以参考表的main值开头就算命中,满足“比对setup列开头部分与main列匹配”的要求;同时保留responsible列和main值的精确匹配规则,和给出的期望输出完全对齐
- 简洁性优化:去掉原脚本里的嵌套循环逐行导出逻辑,所有结果先在内存中收集完成后一次性写入文件,代码更短,执行效率更高,也避免了频繁IO导致的文件占用问题
执行效果
运行后生成的Output.csv和期望结构完全一致:
| type | setup | responsible | team |
|---|---|---|---|
| y | master fin | susan | sa1 |
| y | sensei kuno | peter | sr2 |
| y | sensei jon | peter | sr2 |
| y | junior | jumo | st6 |
内容的提问来源于stack exchange,提问作者nasrul799
相关产品推荐
相关产品推荐

