PowerShell处理GAM数据时如何保留其他字段实现邮箱去重
PowerShell 按邮箱去重并保留所有字段的解决方案
问题根因
Select-Object -Unique 的去重逻辑是对所有你指定的字段的组合值做判断:
- 同时指定
time和email时,同一个邮箱只要对应不同的时间,就会被判定为不同条目,所以没法实现按邮箱单独去重 - 仅指定
email时,自然会丢失time字段内容
方案1:Group-Object 分组去重(写法简单,适合绝大多数场景)
按Email字段分组后,每组取1条记录即可完成去重,可灵活控制保留的时间条目:
保留每个邮箱的第一条匹配记录
$result = $result | Group-Object -Property Email | ForEach-Object { $_.Group[0] }
保留每个邮箱最早的参会记录
$result = $result | Sort-Object { [DateTime]::ParseExact($_.Time, "MM-dd-yy", $null) } | Group-Object -Property Email | ForEach-Object { $_.Group[0] }
保留每个邮箱最新的参会记录
$result = $result | Sort-Object { [DateTime]::ParseExact($_.Time, "MM-dd-yy", $null) } -Descending | Group-Object -Property Email | ForEach-Object { $_.Group[0] }
方案2:哈希表去重(性能更高,适合万条以上的大数据量场景)
$uniqueMap = @{} foreach ($item in $result) { if (-not $uniqueMap.ContainsKey($item.Email)) { $uniqueMap[$item.Email] = $item } } [array]$result = $uniqueMap.Values
内容的提问来源于stack exchange,提问作者dcaz
相关产品推荐
相关产品推荐

