如何使用PowerShell对比同一CSV内两列数据并生成匹配结果列
PowerShell 实现同CSV文件内两列数据比对新增匹配列
场景1:同一行内两列精确匹配
逐行判断当前行的两个目标列值是否一致,匹配则在新增列写入匹配值,不匹配写入0/空值。
# 导入目标CSV文件,替换为实际文件路径 $csvContent = Import-Csv -Path "D:\data\source.csv" # 逐行处理,注意将Column1、Column2替换为你CSV中实际要比对的两列表头名 $processedData = $csvContent | ForEach-Object { # 先做空值校验,避免空值比对报错 if (-not [string]::IsNullOrWhiteSpace($_.Column1) -and $_.Column1 -eq $_.Column2) { # 匹配成功,写入匹配到的数值 $_ | Add-Member -MemberType NoteProperty -Name "MatchResult" -Value $_.Column1 -Force } else { # 匹配失败,此处写0则输出0,替换为$null则输出空值 $_ | Add-Member -MemberType NoteProperty -Name "MatchResult" -Value 0 -Force } $_ } # 导出处理结果到新CSV文件,指定UTF8编码避免中文乱码 $processedData | Export-Csv -Path "D:\data\match_result.csv" -NoTypeInformation -Encoding UTF8
场景2:单列值遍历全表另一列查找匹配
如果需求是取某一列的每个值,遍历整个CSV所有行的另一列查找是否存在匹配项,而非仅比对同一行的值,使用以下实现:
$csvContent = Import-Csv -Path "D:\data\source.csv" # 提前提取目标匹配列的所有非空值存入数组,提升遍历匹配效率 $targetMatchList = $csvContent.Column2 | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } $processedData = $csvContent | ForEach-Object { $currentCheckValue = $_.Column1 if ($targetMatchList -contains $currentCheckValue) { $_ | Add-Member -MemberType NoteProperty -Name "MatchResult" -Value $currentCheckValue -Force } else { $_ | Add-Member -MemberType NoteProperty -Name "MatchResult" -Value 0 -Force } $_ } $processedData | Export-Csv -Path "D:\data\match_result.csv" -NoTypeInformation -Encoding UTF8
调整说明
- 代码中
Column1、Column2需替换为CSV文件实际的表头列名,可先打开CSV确认第一行的表头文本,注意大小写不敏感但不要打错字符 - 如果需要模糊匹配,可将精确比对运算符
-eq替换为-like,配合通配符编写规则,例如$_.Column1 -like "*$($_.Column2)*"即代表Column1包含Column2的值就算匹配成功 - 匹配失败的返回值可按需调整,需要空值时将代码中赋值的
0替换为$null即可 - 若使用PowerShell 7及以上版本,导出编码可替换为
utf8NoBOM,适配更多办公软件的打开需求
内容的提问来源于stack exchange,提问作者RaabK
相关产品推荐
相关产品推荐

