如何在Perl中有效地解析CSV文件?

前端之家收集整理的这篇文章主要介绍了如何在Perl中有效地解析CSV文件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个涉及在Perl中解析大型csv格式文件的项目,并希望使事情更有效率。

我的方法是先分割()文件,然后再用逗号分隔()每行,以获取字段。但是这是次要的,因为数据上至少需要两次传递。 (一次按行划分,然后再次为每一行)。这是一个非常大的文件,所以切割处理一半将是整个应用程序的重大改进。

我的问题是,使用内置工具解析大型CSV文件最有效的方法是什么?

注意:每一行都有不同数量的令牌,所以我们不能只忽略行,并且只能用逗号分隔。我们也可以假设字段只包含字母数字的ASCII数据(没有特殊字符或其他技巧)。此外,我不想进行并行处理,虽然它可能会有效地工作。

编辑

它只能涉及Perl 5.8附带的内置工具。对于官僚原因,我不能使用任何第三方模块(即使托管在cpan上)

另一个编辑

假设我们的解决方案只有在完全加载到内存中后才能处理文件数据。

另一个编辑

我只是把握这个问题是多么的愚蠢。对不起浪费你的时间投票关闭

解决方法

通过一个数量级的方式来做到这一点的正确方法是使用 Text::CSV_XS.它比你自己可能做的任何事情要快得多,更强大。如果您决定仅使用核心功能,则可以根据速度和稳健性选择几个选项。

关于纯Perl的最快速度是逐行读取文件,然后天真地分割数据:

my $file = 'somefile.csv';
my @data;
open(my $fh,'<',$file) or die "Can't read file '$file' [$!]\n";
while (my $line = <$fh>) {
    chomp $line;
    my @fields = split(/,/,$line);
    push @data,\@fields;
}

如果任何字段包含嵌入的逗号,这将失败。更强大(但更慢)的方法将是使用Text :: ParseWords。要做到这一点,用以下替换拆分:

my @fields = Text::ParseWords::parse_line(',',$line);

猜你在找的Perl相关文章