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

如何匹配两个CSV的Manager与DistinguishedName字段并导出合并CSV

问题核心原因

你的脚本存在5个核心错误:

  • 路径写法错误:C:temp\AD.csv缺少反斜杠,会导致无法正确读取CSV1文件
  • 导入制表符分隔的CSV时未指定分隔符,默认逗号分隔会导致导入的表结构完全错乱
  • 遍历逻辑搞反,你需要处理的主体是CSV1的员工记录,而非CSV2的全量用户记录
  • CSV2本身没有Manager列,原匹配条件$_.manager -eq $record.manager永远无法命中
  • 没有从DistinguishedName字段中提取CN值做匹配

修正后脚本

# 1. 导入制表符分隔的两个CSV文件
$csv1 = Import-Csv -Path 'C:\temp\AD.csv' -Delimiter "`t"
$csv2 = Import-Csv -Path 'C:\temp\AD_ExportDN.csv' -Delimiter "`t"

# 2. 提前构造CSV2的映射表,提升匹配效率:key是DN提取的CN姓名,value是用户全量信息
$userMap = @{}
foreach ($user in $csv2) {
    # 用正则提取DistinguishedName中第一个CN=后的姓名(到第一个逗号截止)
    if ($user.DistinguishedName -match '^CN=(?<Name>.*?),') {
        $cnName = $matches.Name
        $userMap[$cnName] = $user
    }
}

# 3. 遍历CSV1的员工记录,匹配对应信息
$output = foreach ($emp in $csv1) {
    # 先匹配当前员工自己的信息,获取SAM、mail
    $empSelfInfo = $userMap[$emp.DisplayName]
    # 再校验经理是否存在于CSV2中(满足你要求的匹配筛选条件)
    $managerExists = $userMap.ContainsKey($emp.Manager)
    
    # 仅输出员工自身信息存在、且经理在CSV2中存在匹配的记录
    if ($empSelfInfo -and $managerExists) {
        [PSCustomObject]@{
            SAMAccountName = $empSelfInfo.SAMAccountName
            mail = $empSelfInfo.mail
            Manager = $emp.Manager
            # 如果需要输出经理的DN而非姓名,把上面一行替换为:
            # Manager = $userMap[$emp.Manager].DistinguishedName
        }
    }
}

# 4. 导出结果,需要制表符分隔的话加 -Delimiter "`t" 即可
$output | Export-Csv -Path 'C:\temp\merged_for_AD2.csv' -NoTypeInformation -Force -Encoding UTF8

脚本说明

  • 正则^CN=(?<Name>.*?),专门适配AD的DistinguishedName格式,准确提取第一个CN节点的姓名
  • 用哈希表$userMap做缓存,避免每次匹配都遍历全量CSV2,数据量越大效率优势越明显
  • 输出字段完全匹配你要求的格式,如果需要调整Manager的输出值(比如改为经理的DN),直接修改对应注释行即可
  • 导出时指定UTF8编码避免中文乱码,如果不需要制表符分隔导出可以去掉-Delimiter "t"`参数

内容的提问来源于stack exchange,提问作者denprash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:06:07