读取 CSV 文件并删除特定行的脚本

问题描述 投票:0回答:1

我有一个 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 技能,所以我发现很难将其写入脚本。谁能帮帮我吗

powershell csv scripting
1个回答
0
投票

虽然通常最好通过 ConvertFrom-Csv

 执行 
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 进行讨论和未来可能的补救措施。
© www.soinside.com 2019 - 2024. All rights reserved.