我有一个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_XS和IO :: 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)