PowerShell按VATRegistrationNumber列删除文本文件重复行
针对10万行级带表头的Tab分隔TXT文件,按VATRegistrationNumber字段去重、保留首次出现记录(即若某VAT号已在GroupID=1000的记录中存在,后续出现的同VAT号GroupID=2000等重复条目直接删除)的需求,手动调用字符串Split方法按制表符切分字段,一旦字段内容本身包含制表符就会出现列错位,是导致误删的核心原因。以下两个经过实测的PowerShell方案均基于PowerShell原生CSV解析逻辑读取文件,可稳定高效完成处理,12万行数据处理耗时不足1分钟:
方案1:HashSet高速去重
借助System.Collections.Generic.HashSet的O(1)时间复杂度查找特性,逐行记录已出现的VATRegistrationNumber值,仅保留首次匹配到的条目,内存占用低、遍历速度最快,适合超大规模文件处理。
$OutputTXT = ".\Output.txt" $Unique = [System.Collections.Generic.HashSet[string]]::new() Import-Csv .\Input.txt -Delimiter "`t" |ForEach-Object { if ($Unique.Add($_.VATRegistrationNumber)) { $_ } } | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | ForEach-Object { $_ -replace '"' } | Set-Content $OutputTXT -Encoding Unicode
- 实现细节说明:
- 用
ConvertTo-Csv替代Export-Csv,搭配-NoTypeInformation参数移除PowerShell CSV导出默认生成的类型信息首行 - 通过正则替换移除CSV转换时自动添加的字段包裹双引号,输出为标准纯Tab分隔TXT格式
- 输出编码设置为Unicode,可兼容多语言特殊字符,避免乱码问题
- 用
方案2:分组取首条去重
通过Group-Object按VATRegistrationNumber字段对全量记录分组,每组仅保留第一条记录,逻辑直观易调整,大文件场景下运行速度表现优异。
$OutputTXT = ".\Output.txt" Import-Csv 'input.txt' -Delimiter `t | Group-Object -Property VATRegistrationNumber | ForEach-Object { if($_.Count -gt 1) { $_.Group | Select-Object -First 1 } else { $_.Group } } | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | ForEach-Object { $_ -replace '"' } | Set-Content $OutputTXT -Encoding Unicode
- 使用提示:两个脚本均默认读取同目录下的
Input.txt作为源文件,去重后的结果写入同目录Output.txt,运行前建议备份原始文件避免误操作。
内容的提问来源于stack exchange,提问作者Jana
相关产品推荐
相关产品推荐

