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

PowerShell中为重复分组记录生成递减后缀UniqueID

PowerShell 按分组生成递减序号的UniqueID

要实现按分组生成GroupName-递减数字格式的UniqueID,核心是为每个分组单独维护计数器,而非使用全局变量。以下是具体实现方案:

核心思路

  1. 用哈希表存储每个分组的当前序号,确保各分组计数器独立;
  2. 遍历数据时,从哈希表读取当前分组的序号生成UniqueID,随后将该分组的序号递减;
  3. 若已有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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:09:24