如何用PowerShell精准实现CSV去重:仅移除STAFF_STATUS为LEFT的重复行
CSV去重:仅移除STAFF_STATUS为"LEFT"的重复行
原始CSV数据
(注:原始数据存在引号未闭合的格式问题,以下为修正后的合法格式)
"STAFF_STATUS","SFKEY","FIRST_NAME","SURNAME","E_MAIL" "ACTV","JON1","JOHN","DOE","John.Doe@email.com" "LEFT","JAN1","JANE","DOE","Jane.Doe@email.com" "ACTV","STE1","STEVE","BEEV","Steve.Beev@email.com" "ACTV","JON5","JOHN","DOE","John.Doe@email.com" "LEFT","JAN2","JANE","DOE","Jane.Doe@email.com"
需求说明
- 以人员唯一标识(如
FIRST_NAME、SURNAME、E_MAIL组合)判断重复行 - 重复行处理规则:仅移除
STAFF_STATUS为"LEFT"的记录;若同一人员同时存在"ACTV"和"LEFT"记录,保留"ACTV";若仅存在"LEFT"记录,则保留该记录
原脚本问题分析
原脚本使用Sort-Object -Property SURNAME,First_Name -unique存在两个核心问题:
- 仅按姓氏和名字分组,易导致不同邮箱的同姓名人员被误判为重复
Sort-Object -unique会保留排序后的第一条记录,若"LEFT"记录排在"ACTV"之前,会错误保留"LEFT"、删除"ACTV",导致准确率不足
100%准确解决方案
PowerShell脚本
# 定义CSV路径 $csvPath = "\\Server\c$\Folder\CSVData.csv" $outputPath = "\\Server\c$\Folder\CSVData(2).csv" # 导入合法格式的CSV数据 $csvData = Import-Csv -Path $csvPath # 按人员唯一标识分组(可根据实际调整分组字段) $groupedData = $csvData | Group-Object -Property FIRST_NAME, SURNAME, E_MAIL # 处理每个分组:优先保留ACTV状态记录,无ACTV则保留LEFT $processedData = $groupedData | ForEach-Object { $activeRecords = $_.Group | Where-Object { $_.STAFF_STATUS -eq "ACTV" } if ($activeRecords.Count -gt 0) { # 保留ACTV记录,若存在多条ACTV则按SFKEY去重 $activeRecords | Sort-Object -Property SFKEY -Unique } else { # 无ACTV时保留唯一的LEFT记录 $_.Group | Sort-Object -Property SFKEY -Unique } } # 导出处理后的CSV $processedData | Export-Csv -Path $outputPath -NoTypeInformation -Encoding UTF8
脚本说明
- 精准分组:通过
Group-Object按FIRST_NAME、SURNAME、E_MAIL组合分组,确保仅同一人员的记录被归为一组,避免误判 - 优先级逻辑:每个分组优先筛选
"ACTV"记录,确保这类有效记录被保留;仅当分组内无"ACTV"时,才保留"LEFT"记录 - 内部去重:针对同一人员的多条
"ACTV"或"LEFT"记录,通过SFKEY字段去重,可根据实际需求调整去重字段
简化版本(仅按姓氏和名字分组)
若确实只需按姓氏和名字判断重复,可修改分组属性:
$groupedData = $csvData | Group-Object -Property SURNAME, FIRST_NAME
内容的提问来源于stack exchange,提问作者Wayne Stanar
相关产品推荐
相关产品推荐

