PowerShell如何在foreach循环中对导入CSV的唯一值分组处理
PowerShell代码修改方案
原代码问题梳理
- 未提前过滤
Group字段为空的无效行 - 拼接
$Groups和$Codes时未做去重处理,导致相同值重复出现 - 最终输出的判断条件
If ($Group.Group)逻辑错误,STE分组的最后一行是Group为空的无效行,导致判断不成立、STE分组被遗漏
修改后的完整代码
$file = "C:\temp\test.txt" # 读取数据、过滤无效行、按Signature分组 $uniqueSigs = (Get-Content $file) -replace "^'|'$" | ConvertFrom-Csv -Delimiter ';' -Header Group,Code,ID,Signature,Type | Where-Object {$_.Group} | # 过滤Group为空的行 Group-Object -Property Signature foreach ($sigGroup in $uniqueSigs) { $Signature = $sigGroup.Name # 生成去重后的Groups $Groups = $sigGroup.Group | ForEach-Object {"$($_.Type):$($_.Group)"} | Select-Object -Unique $Groups = $Groups -join ',' # 生成去重后的Codes $Codes = $sigGroup.Group | ForEach-Object {"$($_.Type):$($_.Code)"} | Select-Object -Unique $Codes = $Codes -join ',' # 按预期格式输出 Write-Host "`$Signature = `"$Signature`" " Write-Host "`$Groups = `"$Groups`"" Write-Host "`$Codes = `"$Codes`"" Write-Host "" # 不同循环之间加空行分隔 }
代码说明
- 读取数据后先用
Where-Object {$_.Group}过滤掉Group为空的行,提前排除无效数据 - 生成拼接字符串时先通过
Select-Object -Unique去重,避免重复值出现 - 使用
-join ','直接拼接数组元素,不需要手动拼接后再替换末尾逗号 - 去掉了错误的输出判断逻辑,保证所有唯一Signature都能正常输出
运行输出结果
$Signature = "BOK" $Groups = "Tree:ALDHT21" $Codes = "Tree:MIMO" $Signature = "STE" $Groups = "Water:PRGHT21,Stone:ABCDT22,Stone:PRA2HT21" $Codes = "Water:AIMO,Stone:DIDO,Stone:ADDO" $Signature = "FRA" $Groups = "Stone:PRGHT21" $Codes = "Stone:AIMO"
如果需要严格按照BOK→FRA→STE的顺序输出,可以在Group-Object后加Sort-Object {$_.Name -eq 'STE'}调整排序规则即可。
内容的提问来源于stack exchange,提问作者aka_1337
相关产品推荐
相关产品推荐

