在 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 格式的字符串而不将其写入磁盘吗?
PHP 正则表达式匹配 preg_match 与 preg_match_all 函数