关于使用PowerShell实现双CSV文件多列匹配对比并导出指定格式结果的技术需求
PowerShell实现CSV分组匹配校验与结果导出
针对你提到的两个CSV文件匹配需求,我写了下面这个PowerShell脚本,完美契合你的规则——不管是处理MainGroup的多值情况,还是空值处理逻辑,都能搞定。而且因为两个文件都是按Name排序的,咱们直接按行对应处理就行,不用额外做复杂的查找,效率也更高。
# 读取两个CSV文件 $csv1 = Import-Csv -Path "CSV1.csv" $csv2 = Import-Csv -Path "CSV2.csv" # 初始化结果数组 $result = @() # 循环处理每一行(因为两个文件按Name排序,索引对应) for ($i = 0; $i -lt $csv1.Count; $i++) { $row1 = $csv1[$i] $row2 = $csv2[$i] # 拆分CSV1的MainGroup为数组,去除前后空格 $mainGroups = $row1.MainGroup -split ',' | ForEach-Object { $_.Trim() } # 获取CSV2的Department和Division,过滤空值 $checkValues = @($row2.Department, $row2.Division) | Where-Object { $_ -and $_ -ne '' } # 收集匹配的分组 $matched = $mainGroups | Where-Object { $checkValues -contains $_ } # 按照规则设置MatchedGroup if ($checkValues.Count -eq 0) { # Department和Division都为空,保留原MainGroup $matchedGroup = $row1.MainGroup } elseif ($matched.Count -gt 0) { # 有匹配值,用匹配到的(多个匹配的话用逗号分隔) $matchedGroup = $matched -join ',' } else { # 无匹配值,这里可以根据需求设置,比如留空或者标记,这里默认留空 $matchedGroup = '' } # 构造结果对象 $resultRow = [PSCustomObject]@{ Name = $row1.Name Username = $row1.Username MatchedGroup = $matchedGroup } $result += $resultRow } # 导出结果到CSV $result | Export-Csv -Path "MatchedResult.csv" -NoTypeInformation -Encoding UTF8
关键逻辑拆解
- 读取CSV:
Import-Csv会自动把CSV文件转换成PowerShell对象,每一行就是一个对象,列名就是属性名,处理起来非常方便。 - 拆分多值MainGroup:用
-split ','把逗号分隔的字符串拆分成数组,再用Trim()去掉每个值前后的空格(避免因为CSV里的空格导致匹配失败)。 - 匹配逻辑:
- 先把CSV2的
Department和Division收集起来,过滤掉空值,得到需要检查的集合。 - 用
Where-Object筛选出MainGroup里和检查集合匹配的值。 - 按照你的规则分支处理:如果检查集合为空(也就是Department和Division都空),直接用原
MainGroup;如果有匹配值,就把匹配到的用逗号拼接;没有匹配的话这里默认留空,你可以根据需要改成比如'No Match'之类的标记。
- 先把CSV2的
- 导出结果:用
Export-Csv把结果数组导出成CSV,-NoTypeInformation会去掉PowerShell默认添加的类型信息,-Encoding UTF8保证导出的CSV不会有乱码问题。
示例运行结果
用你提供的示例数据运行脚本后,导出的MatchedResult.csv内容如下:
Name,Username,MatchedGroup Dave Davidson,Dave.D,NCR Hugo Lotson,Hugo.L,Legion Umi Ugo,Umi,CBA Rendal Echo,Rendal.E,
简单解释下:
- Dave的Department是NCR,和MainGroup匹配,所以MatchedGroup是NCR
- Hugo的Department是Legion,匹配MainGroup,所以保留Legion
- Umi的Department和Division都空,所以保留原MainGroup的CBA
- Rendal的Division是“Legion”,但他的MainGroup是NCR和CBA,没有匹配,所以MatchedGroup留空
内容的提问来源于stack exchange,提问作者the_Alekhnovich
相关产品推荐
相关产品推荐

