我已将最常见的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);
当我尝试打印哈希时,我得到了这个
$VAR1 = { '8' => [ '"EMPNO"','"ENAME"','"JOB"','"MGR"','"HIREDATE"','"SAL"','"COMM"','"DEPTNO" ','"7839"','"KING"','"PRESIDENT"','""','"11/17/1981"','"5000"','"10" ',
但我期待这一点
$VAR1 = { '"EMPNO"'=>[12,3,4,5,6,7,8,9],'"EMPNAME"'=>["pavan","kumar"...],};
解决方法
您试图在推送语句中使用切片,但这不起作用.数组将处于标量上下文中,这就是您看到键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;