pav*_*van 4 perl perl-data-structures
我已将最常见的emp表导出为CSV.我想将每个列名称作为哈希键并将值存储在数组中.
下面是代码
use Data::Dumper;
open($fh,"<EMP.csv");
%hash = ();
local $/= "\n";
while(<$fh>){
@columnNames = split(/,/,$_) if $. ==1;
@columnValues = split(/,/,$_);
push @{hash->{@columnNames}} ,@columnValues;
}
print Dumper(\%hash);
Run Code Online (Sandbox Code Playgroud)
当我尝试打印哈希时,我得到了这个
$VAR1 = {
'8' => [
'"EMPNO"',
'"ENAME"',
'"JOB"',
'"MGR"',
'"HIREDATE"',
'"SAL"',
'"COMM"',
'"DEPTNO"
',
'"7839"',
'"KING"',
'"PRESIDENT"',
'""',
'"11/17/1981"',
'"5000"',
'""',
'"10"
',
Run Code Online (Sandbox Code Playgroud)
但我期待这一点
$VAR1 = { '"EMPNO"'=>[12,3,4,5,6,7,8,9],
'"EMPNAME"'=>["pavan","kumar"...],
};
Run Code Online (Sandbox Code Playgroud)
您试图在推送语句中使用切片,但这不起作用.数组将处于标量上下文中,这就是您看到密钥的原因8.您需要循环键以将值推送到数组上.但是,为什么这样呢?
您可以使用该Text::CSV模块,这是相当简单的,可能更合适,假设您有一个真正的csv格式.
use strict;
use warnings;
use Data::Dumper;
use Text::CSV;
my $csv = Text::CSV->new({
binary => 1,
eol => $/,
});
my %data;
open my $fh, "<", "yourfile.csv" or die $!;
$csv->column_names ($csv->getline($fh)); # get header names
while (my $row = $csv->getline_hr($fh)) { # get hashref with values
for my $key (keys %$row) {
push @{$data{$key}}, $row->{$key}; # store values
}
}
print Dumper \%data;
Run Code Online (Sandbox Code Playgroud)