统计特定键唯一值 筛选Secondary Identifiers计数大于1的Primary Identifier
解决方案
方法1:原生PowerShell Cmdlet实现(适合中小体积数据)
直接用Group-Object结合Select-Object -Unique即可实现需求,完全符合管道处理习惯:
# 导入数据,替换为你实际的CSV文件路径 $sourceData = Import-Csv -Path "C:\你的数据文件.csv" # 统计每个Primary Identifier对应的唯一Secondary Identifier数量 $result = $sourceData | Group-Object -Property 'Primary Identifier' | ForEach-Object { [PSCustomObject]@{ ID = $_.Name 'Count of Secondary ID' = ($_.Group | Select-Object 'Secondary Identifier' -Unique).Count } } # 筛选出存在多个Secondary Identifier的记录 $multiIdRecords = $result | Where-Object { $_.'Count of Secondary ID' -gt 1 }
如果你需要实现类似Excel勾选多列删除重复值的功能,直接在Select-Object后指定所有需要匹配的列即可,和你预期的效果完全一致:
# 示例:按Primary、Secondary两列去重,等效于Excel勾选这两列删除重复值 $deduplicatedData = $sourceData | Select-Object 'Primary Identifier','Secondary Identifier' -Unique
方法2:大体积数据优化方案(适合无法全量加载到内存的超大文件)
用哈希集合逐行流处理,内存占用极低,不会因为数据量过大崩溃:
# 初始化存储映射,Key为Primary Identifier,Value为存唯一Secondary的哈希集合 $primaryMap = [ordered]@{} # 逐行读取处理CSV,无需全量加载 Import-Csv -Path "C:\你的超大数据文件.csv" | ForEach-Object { $pid = $_.'Primary Identifier' $sid = $_.'Secondary Identifier' if (-not $primaryMap.ContainsKey($pid)) { $primaryMap[$pid] = [System.Collections.Generic.HashSet[string]]::new() } # 重复的Secondary ID会自动被哈希集合忽略 $null = $primaryMap[$pid].Add($sid) } # 转换为预期的输出格式 $result = $primaryMap.GetEnumerator() | ForEach-Object { [PSCustomObject]@{ ID = $_.Key 'Count of Secondary ID' = $_.Value.Count } } # 筛选多标识符记录 $multiIdRecords = $result | Where-Object { $_.'Count of Secondary ID' -gt 1 }
两种方法都可以直接得到你预期的输出结构,筛选步骤和你提到的完全兼容。
内容的提问来源于stack exchange,提问作者immobile2
相关产品推荐
相关产品推荐

