加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-15 21:17:49 所属栏目:大数据 来源:网络整理
导读:我正在开发一个涉及在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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读