我有一个 csv 文件(记录 .csv),其中有 400,000 条记录,没有任何标题,其中的每一行如下格式所示:
"1","222","",3333","666",777",""
"2","234","","345","234","456",""
上面示例中的第一列“1”和“2”是定义每一行的唯一编号(我们称之为 URN )
任务:我在 txt 文件(urn.txt)中获得了 1000 个瓮编号的列表,并且被要求编辑上面的 csv 文件(记录 .csv),以便仅保留这千条记录并删除所有其他行。
Urn.txt 文件有一列指定唯一编号 (urn),如下所示:
1
13
16
手动需要时间,是否可以通过 poweshell 脚本来完成?
我知道我需要我的脚本首先读取 csv 文件然后使用逗号分隔符将行分成对象的逻辑,而不是我需要读取 txt 文件,并且我需要使用循环从 txt 文件读取每一行,然后找到该数字在 csv 文件第一列中,如果存在,则只需将整行复制到新的 csv 文件中。
我不是程序员,我没有 powershell 技能,所以我发现很难将其写入脚本。谁能帮帮我吗
执行OO 处理,但在您的情况下,纯文本 处理可以提供更快的解决方案,这对于大型输入文件很重要。
# Create a hash set for all URNs.
$hs = [System.Collections.Generic.HashSet[string]] (Get-Content -ReadCount 0 urn.txt)
# Read all lines lazily from the CSV file and pass only those
# lines through that are in the hash set.
[IO.File]::ReadLines((Convert-Path records.csv)) |
ForEach-Object {
if ($hs.Contains(($_ -split ',')[0].Trim('"'))) {
$_
}
}
上面直接输出结果。
要输出到文件,请附加
| Set-Content ...
,例如| Set-Content filtered.csv
;使用 -Encoding
参数来控制字符编码。
[IO.File]::ReadAllLines()
而不是 [IO.File]::ReadLines()
注:
[IO.File]::ReadLines((Convert-Path records.csv))
纯粹是出于性能原因,因为 PowerShell 惯用的等效项 Get-Content
records.csv
非常慢 - 请参阅 GitHub 问题 #7537 进行讨论和未来可能的补救措施。