如何在PowerShell中合并不同行的单元格数据
PowerShell合并CSV同组用户ID问题解决
输入数据
"Group Name","User ID" "GROUP1","X9998988" "GROUP1","X9982293" "GROUP1","X9953089" "GROUP1","X9952998" "GROUP1","X9209289" "GROUP1","X9205093" "GROUP1","X9208889" "GROUP1","X9292353" "GROUP1","X9293330" "GROUP1","X9229034" "GROUP1","X9222338" "GROUP2","X9205298" "GROUP3","X9953800" "GROUP3","X9933359" "GROUP3","X9993288"
期望输出
"Group Name","User ID" "GROUP1","X9998988,X9982293,X9953089,X9952998,X9209289,X9205093,X9208889,X9292353,X9293330" "GROUP2","X9205298" "GROUP3","X9953800,X9933359,X9993288"
现有代码及错误结果
现有代码
$csv_file = Import-Csv 'C:\Test\Other_Managers.csv' | Group-Object 'Group Name' | ForEach-Object { $groups = $_.Group.'Group Name' $users = $_.Group.'User ID' } foreach ($row In $groups) { $output = $row | Select-Object @{Name = 'Group'; Expression = { $groups } }, @{Name = 'Users'; Expression = { ($users -join ',') } } $output | Export-Csv -Path 'C:\Test\Other_Managers_out.csv' -NoTypeInformation }
错误输出
"Group","Users" "GROUP3 GROUP3 GROUP3","X9953800,X9933359,X9993288"
修正后的代码
Import-Csv 'C:\Test\Other_Managers.csv' | Group-Object 'Group Name' | ForEach-Object { [PSCustomObject]@{ 'Group Name' = $_.Name 'User ID' = $_.Group.'User ID' -join ',' } } | Export-Csv -Path 'C:\Test\Other_Managers_out.csv' -NoTypeInformation
问题解析
- 原代码中
ForEach-Object块内的$groups和$users会被最后一组数据覆盖,仅保留GROUP3的信息。 - 后续的
foreach循环完全冗余,且Select-Object中直接引用$groups会把所有组名拼接成字符串,而非单个组名。 - 修正逻辑:
- 分组后直接用
$_.Name获取当前组的唯一名称,无需遍历重复的组名列表。 - 将当前组下的所有
User ID用-join ','合并为单个字符串。 - 构造
PSCustomObject保留原CSV的列名,最后一次性导出结果,避免循环导出导致的文件覆盖问题。
- 分组后直接用
内容的提问来源于stack exchange,提问作者JEH
相关产品推荐
相关产品推荐

