在 perl 中使用 TEXT::CSV_XS 模块将 CSV 文件转换为哈希结构

Posted

技术标签:

【中文标题】在 perl 中使用 TEXT::CSV_XS 模块将 CSV 文件转换为哈希结构【英文标题】:To Convert CSV File to Hash Structure using TEXT::CSV_XS Module in perl 【发布时间】: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,你就可以用它做任何你想做的事。因此,只需打开文档,查看概要,然后尝试一下。 (那么这里也有很多关于它的帖子) 【参考方案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();

【讨论】:

以上是关于在 perl 中使用 TEXT::CSV_XS 模块将 CSV 文件转换为哈希结构的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Text::CSV_XS 解析 csv 格式的字符串而不将其写入磁盘吗?

如何从 Perl 快速访问许多大型 CSV 文件中的数据?

PHP 正则表达式匹配 preg_match 与 preg_match_all 函数

当 y 为 0 时,模运算符 x % y 的语义是啥?

使用 perl 循环中的变量在 perl 循环中运行 shell 命令

在 vim 编辑中使用 perl 单行命令