【发布时间】:2018-11-02 13:50:25
【问题描述】:
我有一个巨大的 csv 文件,其中包含大约 1300 万行和大约 50 列(文件 #1)。我有另一个包含大约 11k 行的文件,它是 IP 地址列表(文件 #2),它也是第一个文件中的 50 列之一。如何过滤文件 #1,以便输出仅包含从文件 #2 中找到 IP 地址的那些行?
这是我迄今为止尝试过的,但它已经运行了 12 个小时并且还在计数:
$IP = Get-Content -Path C:\Documents\File2.txt
Import-Csv C:\Documents\File1.csv | Where-Object {$_.IP -eq $IP} | Export-csv -Path C:\Documents\File3.csv -NoTypeInformation
【问题讨论】:
-
Get-Content返回一个字符串数组。如果要检查$_.IP是否是该数组中包含的值,请使用-in而不是-eq,或者使用Where-Object { $IP -contains $_.$IP }。有了这么大的文件,代码会花点时间。也许从 File2.txt 中对 ip 数组进行排序有助于加快速度? -
可能值得从您的文件中抽取一小部分样本,以确保在处理这么多数据之前让逻辑正常工作。确定它是否正在工作或现在会更快。
-
+1 @Theo 的评论。而且... 13m x 11k = 143,000,000,000。这似乎达到了“崩溃 ps”的水平......也许可以尝试这样的事情:spjeff.com/2017/06/02/powershell-split-csv-in-1000-line-batches 将您的 csv 分解为一些更易于管理的大小。也许至少你可以运行 13x 1m 的文件。然后在事后附加它们。如果你们认为这是个好主意,我可以写一篇文章。
-
他正在“流式传输” csv,因此他不会将所有内容都保存在内存中。如果他使用的是 foreach 循环,情况会有所不同。不过,这并不意味着这种方式会很快。 :-)
-
我没有意识到这是@MikeShepard 的工作原理。我想这是将所有内容都保留在管道中而不是一直分配的主要原因?
标签: powershell csv