加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:19:03 所属栏目:大数据 来源:网络整理
导读:我已将最常见的emp表导出为CSV.我想将每个列名称作为哈希键并将值存储在数组中. 下面是代码 use Data::Dumper; open($fh,"EMP.csv"); %hash = (); local $/= "n"; while($fh){ @columnNames = split(/,/,$_) if $. ==1; @columnValues = split(/,$_); push
我已将最常见的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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读