CSV变为哈希

RH.*_*RH. 4 perl hash

我有一个csv,第一列是标签后跟逗号分隔的值:

LabelA,45,56,78,90
LabelB,56,65,43,32
LabelC,56,87,98,45
Run Code Online (Sandbox Code Playgroud)

我希望第一列(LabelA等)成为散列中的Key,其中包含数组中的数值.

我可以将文件读入数组或标量,但我不知道在那之后该怎么做.建议?

编辑:好的,所以它看起来像是将值赋给一个键..但是我的例子中逗号分隔的数字怎么样?他们要去哪?他们是%哈希?如果是这样,你可能会进一步愚弄你的解释?谢谢.

Tod*_*ner 10

就个人而言,我喜欢Text :: CSV_XSIO :: File模块:

use Text::CSV_XS;
use IO::File;

# Usage example:
my $hash_ref = csv_file_hashref('some_file.csv');

foreach my $key (sort keys %{$hash_ref}){
   print qq{$key: };
   print join q{,}, @{$hash_ref->{$key}};
   print qq{\n};
}

# Implementation:
sub csv_file_hashref {
   my ($filename) = @_;

   my $csv_fh = IO::File->new($filename, 'r');
   my $csv = Text::CSV_XS->new ();

   my %output_hash;

   while(my $colref = $csv->getline ($csv_fh))
   {
      $output_hash{shift @{$colref}} = $colref;
   }

   return \%output_hash;
}
Run Code Online (Sandbox Code Playgroud)


小智 7

好吧,我们假设没有特殊字符等等.

首先打开文件:

open my $fh, '<', 'some.file.csv' or die "Cannot open: $!";
Run Code Online (Sandbox Code Playgroud)

然后你循环读取它:

while (my $line = <$fh>) {
Run Code Online (Sandbox Code Playgroud)

然后,删除尾随的白色字符(\n和其他):

$line =~ s/\s*\z//;
Run Code Online (Sandbox Code Playgroud)

并将其拆分为数组:

my @array = split /,/, $line;
Run Code Online (Sandbox Code Playgroud)

当它在数组中时,你得到数组的第一个元素:

my $key = shift @array;
Run Code Online (Sandbox Code Playgroud)

并将其存储在哈希中:

$hash{$key} = \@array;
Run Code Online (Sandbox Code Playgroud)

(\ @array表示对数组的引用).

整码:

my %hash;
open my $fh, '<', 'some.file.csv' or die "Cannot open: $!";
while (my $line = <$fh>) {
  $line =~ s/\s*\z//;
  my @array = split /,/, $line;
  my $key = shift @array;
  $hash{$key} = \@array;
}
close $fh;
Run Code Online (Sandbox Code Playgroud)