使用Perl读取大量CSV文件的最佳方法是什么?

And*_*niz -2 csv perl file

要求

  • 我有一个非常大的CSV文件可供阅读.(约3 GB)
  • 我不需要所有记录,我的意思是,我们可以使用一些条件,例如,如果第3个CSV列内容为"XXXX"且第4列为"999".

问题: 我可以使用这些条件来改进读取过程吗?如果是这样,我怎么能用Perl做到这一点?

我在你的答案中需要一个例子(Perl Script).

sin*_*ish 13

这是一个解决方案:

#!/usr/bin/env perl
use warnings;
use strict;
use Text::CSV_XS;
use autodie;
my $csv = Text::CSV_XS->new();
open my $FH, "<", "file.txt";
while (<$FH>) {
    $csv->parse($_);
    my @fields = $csv->fields;
    next unless $fields[1] =~ /something I want/;
    # do the stuff to the fields you want here
}
Run Code Online (Sandbox Code Playgroud)

  • 在解析调用中缺少部分解引用运算符.并且,正则表达式是畸形的,但除了那个伟大的例子. (2认同)

ziy*_*iya 5

使用Text :: CSV

  • 它将使用:: _ XS,如果它存在于您的系统上. (6认同)

Dav*_*man 5

你的a)问题已经回答了几次,但b)尚未得到解决:

我不需要所有记录,我的意思是,我们可以使用一些条件,例如,如果第3个CSV列内容为"XXXX"且第4列为"999".我可以使用这些条件来改善读取过程吗?

不会.你怎么知道第三个CSV列是否包含'XXXX'或者第四个是'999'而没有先读取该行?(DBD :: CSV允许您将其隐藏在SQL WHILE子句后面,但是,因为CSV是未编制索引的数据,所以它仍然需要读取每一行以确定哪个匹配条件,哪个不匹配.)

几乎可以使用行的内容来跳过读取部分文件的唯一方法是,如果它包含告诉您的信息1)"跳过此行后面的部分"和2)"继续读取字节偏移量nnn" .