【问题标题】:To Convert CSV File to Hash Structure using TEXT::CSV_XS Module in perl在 perl 中使用 TEXT::CSV_XS 模块将 CSV 文件转换为哈希结构
【发布时间】:2020-09-21 10:40:50
【问题描述】:

下面的代码用于读取 csv 文件并转换为哈希。键取决于用户需要的键列数。

use warnings;
use strict;

my %hash;     
my $KeyCols = 2;
while (<DATA>) {
    chomp;
    my @cols = split /,/, $_, $KeyCols+1;
    next unless @cols > $KeyCols;
    my $v = pop @cols;
    my $k = join '', @cols;
    $hash{$k} = $v;
}

为了提高效率,我需要帮助才能使用 TEXT::CSV_XS 包实现相同的逻辑。请帮忙。

【问题讨论】:

  • Text::CSV_XS 将为您做的是split ... 行,但正确地不管许多可能的“有趣”情况,也许更快 --- 你需要的是最基本的使用它,一旦你有了@cols,你就可以用它做任何你想做的事。因此,只需打开文档,查看概要,然后尝试一下。 (那么这里也有很多关于它的帖子)

标签: perl cpan strawberry-perl metacpan


【解决方案1】:

使用 Text::CSV_XS 的真正原因是为了正确。它不会比你拥有的更快,但它会在你失败的地方工作。

use Text::CSV_XS qw( );

my $csv = Text::CSV_XS->new({
    auto_diag => 2,
    binary    => 1,
});

my %hash;
while ( my $row = $csv->getline(\*DATA) ) { 
   $hash{ $row->[0] . $row->[1] } = $row;
}

直接将字段连接在一起(没有分隔符)似乎很奇怪。

以上内容使值成为字段数组而不是 CSV。如果您想要原始格式的 CSV,则需要将它们重新编码为 CSV。

my %hash;
while ( my $row = $csv->getline(\*DATA) ) { 
   my ($k1, $k2) = splice(@$row, 0, 2);
   $csv->combine(@$row);
   $hash{ $k1 . $k2 } = $csv->string();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2019-05-17
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多