PowerShell中如何基于CSV姓名匹配批量填充新数组的Roles列
PowerShell中如何基于CSV姓名匹配批量填充新数组的Roles列
我仔细看了你的需求和现有脚本,核心是要把test1.csv里的所有用户条目完整保留,同时根据realName匹配test2.csv里的对应姓名,把ApprovedGroups填充到新数组的Roles列。原脚本的循环逻辑和UPDATE里的哈希表写法都有小问题,咱们一步步修正。
首先拆解问题根源:
- 原脚本最后那段匹配循环逻辑混乱:
$j初始化在foreach外只会执行一次,且错误地用$row[$j]访问单个对象的属性,匹配时也没正确遍历$content2找对应行 - UPDATE里的哈希表写法有缺陷:同一个
realName对应多个userName时,哈希表会覆盖之前的value,导致最后只保留了每个姓名的最后一个userName,不符合需求
修正后的高效完整脚本
我推荐用哈希表做快速匹配,比循环遍历效率高很多,尤其是数据量大的时候:
# 导入CSV文件 $content1 = Import-Csv -Path "C:\Users\blah\Desktop\Test\test1.csv" $content2 = Import-Csv -Path "C:\Users\blah\Desktop\Test\test2.csv" # 先创建姓名-角色的哈希表,用于快速查找 $nameToRoles = @{} foreach ($roleRow in $content2) { $nameToRoles[$roleRow.Name] = $roleRow.ApprovedGroups } # 直接遍历content1构建目标数组,同时填充Roles列 $content3 = foreach ($userRow in $content1) { [PSCustomObject]@{ UserName = $userRow.username Name = $userRow.realName # 从哈希表快速取对应角色,无匹配则留空(可按需调整) Roles = $nameToRoles[$userRow.realName] ?? "" } } # 输出最终结果 $content3
关键优化说明
- 哈希表快速匹配:提前把
content2的姓名和角色映射存入哈希表,后续匹配无需循环遍历,直接通过key取值,效率提升明显 - 避免低效数组追加:原脚本用
$content3 +=会频繁重建数组,直接用foreach输出对象,PowerShell会自动收集为数组,性能更好 - 一步到位构建数组:遍历
content1时直接填充Roles,无需先创建空数组再二次循环修改
如果你的PowerShell版本低于7(不支持??空合并运算符),可以把Roles行替换为:
Roles = if ($nameToRoles.ContainsKey($userRow.realName)) { $nameToRoles[$userRow.realName] } else { "" }
兼容原脚本分步逻辑的修正版
如果你想保留先创建空数组再填充的分步写法,也可以这样修改匹配循环:
# 原脚本的content3初始化部分保留 $content3 =@() $i = 0 while ($i -lt $content1.Length) { $content3 += [PSCustomObject]@{ UserName = $content1[$i].username Name = $content1[$i].realName Roles = "" } $i++ } # 修正后的匹配循环 foreach ($row in $content3) { # 从content2中找到对应姓名的行 $matchingRow = $content2 | Where-Object { $_.Name -eq $row.Name } if ($matchingRow) { $row.Roles = $matchingRow.ApprovedGroups } } # 输出结果 $content3
运行以上任意版本脚本,都能得到你想要的完整结果:每个userName条目都会对应正确的Roles值,不会遗漏任何用户。
内容来源于stack exchange
相关产品推荐
相关产品推荐

