gpt4 book ai didi

perl - Perl 中最快的 CSV 解析器

转载 作者:行者123 更新时间:2023-12-04 01:32:32 25 4
gpt4 key购买 nike

我正在创建一个子程序:
(1) 解析一个CSV文件;
(2) 并检查该文件中的所有行是否具有预期的列数。如果列数无效,它会发出嘶哑的声音。
当行数从几千到几百万不等时,你认为最有效的方法是什么?
现在,我正在尝试这些实现。
(1) 基本文件解析器

open my $in_fh, '<', $file or 
croak "Cannot open '$file': $OS_ERROR";

my $row_no = 0;
while ( my $row = <$in_fh> ) {
my @values = split (q{,}, $row);
++$row_no;
if ( scalar @values < $min_cols_no ) {
croak "Invalid file format. File '$file' does not have '$min_cols_no' columns in line '$row_no'.";
}
}

close $in_fh
or croak "Cannot close '$file': $OS_ERROR";
(2) 使用 Text::CSV_XS (bind_columns 和 csv->getline)
my $csv = Text::CSV_XS->new () or                                                                         
croak "Cannot use CSV: " . Text::CSV_XS->error_diag();
open my $in_fh, '<', $file or
croak "Cannot open '$file': $OS_ERROR";

my $row_no = 1;
my @cols = @{$csv->getline($in_fh)};
my $row = {};
$csv->bind_columns (\@{$row}{@cols});
while ($csv->getline ($in_fh)) {
++$row_no;
if ( scalar keys %$row < $min_cols_no ) {
croak "Invalid file format. File '$file' does not have '$min_cols_no' columns in line '$row_no'.";
}
}

$csv->eof or $csv->error_diag();
close $in_fh or
croak "Cannot close '$file': $OS_ERROR";
(3) 使用 Text::CSV_XS (csv->parse)
my $csv = Text::CSV_XS->new() or                                                                         
croak "Cannot use CSV: " . Text::CSV_XS->error_diag();
open my $in_fh, '<', $file or
croak "Cannot open '$file': $OS_ERROR";

my $row_no = 0;
while ( <$in_fh> ) {
$csv->parse($_);
++$row_no;
if ( scalar $csv->fields < $min_cols_no ) {
croak "Invalid file format. File '$file' does not have '$min_cols_no' columns in line '$row_no'.";
}
}

$csv->eof or $csv->error_diag();
close $in_fh or
croak "Cannot close '$file': $OS_ERROR";
(4) 使用 Parse::CSV
use Parse::CSV;                                                                                           
my $simple = Parse::CSV->new(
file => $file
);

my $row_no = 0;
while ( my $array_ref = $simple->fetch ) {
++$row_no;
if ( scalar @$array_ref < $min_cols_no ) {
croak "Invalid file format. File '$file' does not have '$min_cols_no' columns in line '$row_no'.";
}
}
我使用 Benchmark 模块对它们进行了基准测试。
use Benchmark qw(timeit timestr timediff :hireswallclock);
这些是 数字(以秒为单位)我得到:
1000 行文件:

Implementation 1: 0.0016

Implementation 2: 0.0025

Implementation 3: 0.0050

Implementation 4: 0.0097


10,000 行文件:

Implementation 1: 0.0204

Implementation 2: 0.0244

Implementation 3: 0.0523

Implementation 4: 0.1050


1,500,000 行文件:

Implementation 1: 1.8697

Implementation 2: 3.1913

Implementation 3: 7.8475

Implementation 4: 15.6274


鉴于这些数字,我会得出结论,简单的解析器是最快的,但从我从不同来源阅读的内容来看,Text::CSV_XS 应该是最快的。
有人会启发我吗?我使用模块的方式有问题吗?非常感谢你的帮助!

最佳答案

有 CSV 文件

header1,header2,header3
value1,value2,value3

然后是 CSV 文件。
header1,"This, as they say, is header2","And header3
even contains a newline!"
value1,"value2, 2nd in a series of 3 values",value3
Text::CSV及其同类产品经过精心开发和测试以应对第二种。如果您确信您的输入确实并且始终符合简单的 CSV 规范,那么您很可能可以构建一个性能优于 Text::CSV 的解析器。 .

关于perl - Perl 中最快的 CSV 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13916962/

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