PowerShell清洗CSV时跟踪更新行与被拒绝行的实现方案咨询
CSV数据清洗多拒绝原因实现方案
两种拒绝原因存储方案优劣对比
- 管道分隔字符串方案
- 优势:CSV导出不需要额外转换,直接写入即可正常显示,人工查看时不需要二次处理
- 劣势:如果后续需要对拒绝原因做统计、筛选,需要额外拆分字符串,性能略差
- 适用场景:仅需要导出
reject.csv做人工核对,不需要后续程序二次处理拒绝原因的场景,实现成本极低
- ArrayList/数组存储方案
- 优势:新增、删除、统计拒绝原因时不需要操作字符串,逻辑更简洁,不会出现拼接错误
- 劣势:导出CSV时会自动显示类型名,需要额外转换为分隔字符串才能正常导出
- 适用场景:需要在脚本内对拒绝原因做批量处理、统计的场景,否则没必要额外使用
推荐实现代码(单遍历+分隔字符串存拒绝原因)
全程仅遍历一次CSV,不需要提前拆分数据,内存占用远低于多次用.Where()拆分的写法
# 初始化两个结果集合 $outputFixed = [System.Collections.Generic.List[PSObject]]::new() $outputReject = [System.Collections.Generic.List[PSObject]]::new() # 单次遍历所有行 Import-Csv $CSV | ForEach-Object { $row = $_ # 强制初始化拒绝原因属性,不管是否存在都覆盖,不需要额外判断 $row | Add-Member -NotePropertyName "Reject Reason" -NotePropertyValue "" -Force # 校验规则1:Account ID缺失 if ([string]::IsNullOrEmpty($row."Account ID")) { $row."Reject Reason" = @($row."Reject Reason", "Account ID missing") -ne '' -join '|' } # 校验规则2:其他校验逻辑,可自行扩展,修复逻辑也可以写在这里 if ($row."Phone" -notmatch '^\d{11}$') { # 此处可加修复逻辑,修复失败再追加拒绝原因 $row."Reject Reason" = @($row."Reject Reason", "Phone number format error") -ne '' -join '|' } # 更多校验/修复规则可以继续扩展... # 最终判断行归属 if ([string]::IsNullOrEmpty($row."Reject Reason")) { # 正常行删除拒绝原因列,避免Fixed.csv多出无用字段 $row.PSObject.Properties.Remove("Reject Reason") $outputFixed.Add($row) } else { $outputReject.Add($row) } } # 导出结果文件 $outputFixed | Export-Csv -LiteralPath "$($CSV.DirectoryName)\$($CSV.BaseName)Fixed.csv" -NoTypeInformation -Encoding UTF8 $outputReject | Export-Csv -LiteralPath "$($CSV.DirectoryName)\$($CSV.BaseName)_reject.csv" -NoTypeInformation -Encoding UTF8
实现说明
Add-Member加-Force参数,不需要判断属性是否存在,可直接强制写入,简化判断逻辑- 拒绝原因拼接用
@($oldValue, $newReason) -ne '' -join '|'的写法,避免第一次拼接时开头多出多余|的问题 - 正常行导出前删除
Reject Reason属性,保证清洗后文件不会多出无关列
可选:ArrayList存储拒绝原因的实现片段
如果有程序处理拒绝原因的需求,可以用该方案:
# 初始化拒绝原因属性为ArrayList $row | Add-Member -NotePropertyName "Reject Reason" -NotePropertyValue ([System.Collections.ArrayList]::new()) -Force # 新增拒绝原因 [void]$row."Reject Reason".Add("Account ID missing") # 导出前统一转换为分隔字符串 $outputReject | ForEach-Object { $_."Reject Reason" = $_."Reject Reason" -join '|' } | Export-Csv -LiteralPath $rejectPath -NoTypeInformation
内容的提问来源于stack exchange,提问作者immobile2
相关产品推荐
相关产品推荐

