gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:18:50 28 4
gpt4 key购买 nike

我正在从事一个涉及在 Perl 中解析大型 csv 格式文件的项目,并希望使事情变得更高效。

我的方法是 split()首先按行文件,然后 split()每行再次用逗号获取字段。但这不是最理想的,因为至少需要对数据进行两次传递。 (一次按行拆分,然后再为每行拆分一次)。这是一个非常大的文件,因此将处理减半将对整个应用程序进行重大改进。

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

注意:每一行都有不同数量的标记,所以我们不能忽略行,只用逗号分隔。我们还可以假设字段将仅包含字母数字 ascii 数据(没有特殊字符或其他技巧)。另外,我不想进入并行处理,尽管它可能有效。

编辑

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

另一个编辑

假设我们的解决方案只允许在文件数据完全加载到内存后处理它。

又一次编辑

我才明白这个问题有多愚蠢。很抱歉浪费您的时间。投票结束。

最佳答案

这是一个也尊重引号的版本(例如 foo,bar,"baz,quux",123 -> "foo", "bar", "baz,quux", "123" )。

sub csvsplit {
my $line = shift;
my $sep = (shift or ',');

return () unless $line;

my @cells;
$line =~ s/\r?\n$//;

my $re = qr/(?:^|$sep)(?:"([^"]*)"|([^$sep]*))/;

while($line =~ /$re/g) {
my $value = defined $1 ? $1 : $2;
push @cells, (defined $value ? $value : '');
}

return @cells;
}

像这样使用它:
while(my $line = <FILE>) {
my @cells = csvsplit($line); # or csvsplit($line, $my_custom_seperator)
}

关于perl - 如何在 Perl 中有效地解析 CSV 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065095/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com