Преобразование CSV-файла в хэш-структуру с использованием модуля TEXT :: CSV_XS в perl

Ниже приведен код, который используется для чтения файла 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 для повышения эффективности. Пожалуйста помоги.

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();
}
Другие вопросы по тегам