I have exported most common emp table as CSV. I would like to take each column name as hash key and store the values in an array.
Below is the code
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);
when I try to print the hash I am getting this
$VAR1 = {
'8' => [
'"EMPNO"',
'"ENAME"',
'"JOB"',
'"MGR"',
'"HIREDATE"',
'"SAL"',
'"COMM"',
'"DEPTNO"
',
'"7839"',
'"KING"',
'"PRESIDENT"',
'""',
'"11/17/1981"',
'"5000"',
'""',
'"10"
',
But I'm expecting this instead
$VAR1 = { '"EMPNO"'=>[12,3,4,5,6,7,8,9],
'"EMPNAME"'=>["pavan","kumar"...],
};
You are trying to use a slice in a push statement, and that will not work. The array will be in scalar context, which is why you see the key 8
. You would need to loop over the keys to push values onto the arrays. However, why do it that way?
You can use the Text::CSV
module for this, which is rather simple and probably more appropriate, assuming you have a real csv format.
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;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With