如何用PowerShell脚本筛选CSV文件中指定URN的记录?
PowerShell 脚本筛选CSV指定URN行
以下是针对需求的高效解决方案,兼顾性能和兼容性:
方案1:快速处理简单CSV(无复杂字段)
适合CSV字段不含逗号或引号包裹的场景,处理40万条记录速度较快:
# 1. 加载需保留的URN到哈希表(实现O(1)快速查找) $keepUrns = @{} Get-Content .\urn.txt | ForEach-Object { $cleanUrn = $_.Trim() if ($cleanUrn) { $keepUrns[$cleanUrn] = $true } } # 2. 筛选CSV中符合条件的行并输出 Get-Content .\records.csv | ForEach-Object { # 仅分割首列与剩余内容,避免字段内逗号干扰 $splitLine = $_ -split ',', 2 $currentUrn = $splitLine[0].Trim('"') # 处理可能的引号包裹 if ($keepUrns.ContainsKey($currentUrn)) { $_ # 保留该行 } } | Out-File .\filtered_records.csv -Encoding utf8
方案2:兼容复杂CSV(含引号/内部逗号)
如果CSV存在带引号的字段(如"URN123","Smith, John"),用Import-Csv能正确解析格式:
# 1. 加载需保留的URN到哈希表 $keepUrns = @{} Get-Content .\urn.txt | ForEach-Object { $cleanUrn = $_.Trim() if ($cleanUrn) { $keepUrns[$cleanUrn] = $true } } # 2. 导入CSV(指定临时表头)、筛选、导出无表头结果 Import-Csv .\records.csv -Header 'URN', 'Col1', 'Col2', 'Col3', 'Col4', 'Col5' | Where-Object { $keepUrns.ContainsKey($_.URN.Trim('"')) } | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | # 移除临时表头 Out-File .\filtered_records.csv -Encoding utf8
关键说明
- 哈希表的作用:40万条记录下,哈希表的查找效率远高于数组,避免循环遍历带来的性能损耗。
- 输出新文件:建议先输出到
filtered_records.csv,确认结果正确后再替换原文件,防止数据丢失。 - 分隔符调整:如果CSV用制表符分隔,将
-split ','改为-split "t"`即可。
内容的提问来源于stack exchange,提问作者user27393232
相关产品推荐
相关产品推荐

