无法在perl中获得CSV格式的所需哈希值

前端之家收集整理的这篇文章主要介绍了无法在perl中获得CSV格式的所需哈希值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已将最常见的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;

猜你在找的Perl相关文章