我有一个像这样的CSV文件:
name,email,salary
a,b@b.com,1000
d,e@e.com,2000
现在,我需要将它转换为Perl中的哈希映射数组,所以当我执行类似的操作时:
table[1]{"email"}
它返回e@e.com。
我写的代码是:
open(DATA, "<$file") or die "Cannot open the file\n";
my @table;
#fetch header line
$line = <DATA>;
my @header = split(',',$line);
#fetch data tuples
while($line = <DATA>)
{
my %map;
my @row = split(',',$line);
for($index = 0; $index <= $#header; $index++)
{
$map{"$header[$index]"} = $row[$index];
}
push(@table, %map);
}
close(DATA);
但我没有得到理想的结果..你可以帮忙吗?提前谢谢......
答案 0 :(得分:5)
这一行
push(@table, %map)
应该是
push(@table, \%map)
您希望table
成为哈希引用列表;您的代码将%map
中的每个键和值作为单独的元素添加到列表中。
答案 1 :(得分:4)
这里没有必要重新发明轮子。您可以使用Text::CSV
module。
#!/usr/bin/perl
use strict;
use warnings;
use v5.16;
use Text::CSV;
my $csv = Text::CSV->new;
open my $fh, "<:encoding(utf8)", "data.csv" or die "data.csv: $!";
$csv->column_names( $csv->getline ($fh) );
while (my $row = $csv->getline_hr ($fh)) {
say $row->{email};
}
答案 2 :(得分:2)
或许这样的事情:
#!/usr/bin/perl
use strict;
use warnings;
use 5.010;
my @table;
chomp(my $header = <DATA>);
my @cols = split /,/, $header; # Should really use a real CSV parser here
while (<DATA>) {
chomp;
my %rec;
@rec{@cols} = split /,/;
push @table, \%rec;
}
say $table[1]{email};
__END__
name,email,salary
a,b@b.com,1000
d,e@e.com,2000