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

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 "" # 不同循环之间加空行分隔
}

代码说明

  1. 读取数据后先用Where-Object {$_.Group}过滤掉Group为空的行,提前排除无效数据
  2. 生成拼接字符串时先通过Select-Object -Unique去重,避免重复值出现
  3. 使用-join ','直接拼接数组元素,不需要手动拼接后再替换末尾逗号
  4. 去掉了错误的输出判断逻辑,保证所有唯一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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:06:05