You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用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'之类的标记。
  • 导出结果:用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 03:17:38