我正在开发一个涉及在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);