PowerShell中为重复分组记录生成递减后缀UniqueID
PowerShell 按分组生成递减序号的UniqueID
要实现按分组生成GroupName-递减数字格式的UniqueID,核心是为每个分组单独维护计数器,而非使用全局变量。以下是具体实现方案:
核心思路
- 用哈希表存储每个分组的当前序号,确保各分组计数器独立;
- 遍历数据时,从哈希表读取当前分组的序号生成UniqueID,随后将该分组的序号递减;
- 若已有
CountIF列(该分组的总条数),直接用它初始化对应分组的计数器;若无,则先统计每个分组的总条数。
代码实现
场景1:已有CountIF列(预定义分组总条数)
假设样本数据已包含GroupName和CountIF列:
# 模拟样本数据 $sampleData = @( [PSCustomObject]@{GroupName = 'Marvel'; CountIF = 3}, [PSCustomObject]@{GroupName = 'Marvel'; CountIF = 3}, [PSCustomObject]@{GroupName = 'Marvel'; CountIF = 3}, [PSCustomObject]@{GroupName = 'DC'; CountIF = 2}, [PSCustomObject]@{GroupName = 'DC'; CountIF = 2} ) # 创建哈希表,跟踪每个分组的当前序号 $groupCounters = @{} # 处理每条数据生成UniqueID $processedData = $sampleData | ForEach-Object { $group = $_.GroupName # 初始化当前分组的计数器(仅第一次遇到该组时执行) if (-not $groupCounters.ContainsKey($group)) { $groupCounters[$group] = $_.CountIF } # 生成UniqueID $uniqueId = "$group-$($groupCounters[$group])" # 计数器递减,为下一条同组记录准备 $groupCounters[$group]-- # 将UniqueID添加到原对象并返回 $_ | Add-Member -NotePropertyName 'UniqueID' -NotePropertyValue $uniqueId -PassThru } # 查看结果 $processedData | Format-Table GroupName, CountIF, UniqueID -AutoSize
执行后输出:
GroupName CountIF UniqueID --------- ------- -------- Marvel 3 Marvel-3 Marvel 3 Marvel-2 Marvel 3 Marvel-1 DC 2 DC-2 DC 2 DC-1
场景2:无CountIF列,需自动统计分组条数
如果数据没有预定义的CountIF列,可先统计每个分组的总条数,再按上述逻辑处理:
# 模拟无CountIF列的样本数据 $sampleData = @( [PSCustomObject]@{GroupName = 'Marvel'}, [PSCustomObject]@{GroupName = 'Marvel'}, [PSCustomObject]@{GroupName = 'Marvel'}, [PSCustomObject]@{GroupName = 'DC'}, [PSCustomObject]@{GroupName = 'DC'} ) # 统计每个分组的总条数,转换为哈希表 $groupCounts = @{} $sampleData | Group-Object GroupName | ForEach-Object { $groupCounts[$_.Name] = $_.Count } # 初始化分组计数器 $groupCounters = $groupCounts.Clone() # 生成UniqueID(逻辑同场景1) $processedData = $sampleData | ForEach-Object { $group = $_.GroupName $uniqueId = "$group-$($groupCounters[$group])" $groupCounters[$group]-- $_ | Add-Member -NotePropertyName 'UniqueID' -NotePropertyValue $uniqueId -PassThru } $processedData | Format-Table GroupName, UniqueID -AutoSize
关键说明
- 哈希表
$groupCounters是核心:它为每个分组单独存储计数器,避免了全局变量导致的序号混乱; - 每次处理同组记录时,计数器仅在当前分组内递减,完全符合分组内序号递减的需求。
内容的提问来源于stack exchange,提问作者SA2023
相关产品推荐
相关产品推荐

