我是Perl的新手。我试图从CSV文件创建哈希。
我的CSV数据目前如下所示:
id,name,title,rating
123,Andrew,Book 1,3
1221,Abraham,Book 2,4
43,Annie,Book 3,1
我希望哈希看起来像这样
$reviews = {
review => [
{
id => [ 123 ],
name => [ Andrew ],
title => [ "Book 1" ],
rating => [ 3 ],
},
{
id => [ 1221 ],
name => [ Abraham ],
title => [ "Book 2" ],
rating => [ 4 ]]
},
{
id => [ 43 ],
name => [ Annie ],
title => [ "Book 3" ],
edition => [ 1 ],
},
]
};
但是我得到了这个
$VAR1 = {
'123' => {
'name' => 'Andrew',
'title' => 'Book 1',
'id' => '123',
'rating' => '3',
},
'1221' => {
'name' => 'Abraham',
'title' => 'Book 2',
'id' => '1221',
'rating' => '4',
},
'43' => {
'name' => 'Annie',
'title' => 'Book 3',
'id' => '43',
'rating' => '1',
}
};
这是我到目前为止使用的代码。我的CSV位于output.csv
文件中,我在hashr.txt
文件中打印哈希
my %hash;
open (RESULTS, "output.csv")|| die "Can't open output.csv: $!\n";
open (HASHR, "+>hashr.txt")|| die "Can't open hashr.txt: $!\n";
while (<RESULTS>) {
last if /id/
}
my $labels = $_; #save last line to label keys
chop $labels;
while (<RESULTS>) {
chomp;
my @array = split /,/;
my $index = 0;
my %h = map { $_ => $array[$index++]} split( ",", $labels );
#my $key = "review";
#$hash{$key}=\%h;
$hash{ $array[0] } = \%h;
}
print Dumper(\%hash);
print HASHR Dumper(\%hash);
close RESULTS;
答案 0 :(得分:1)
您想要的数据结构很奇怪,但以下内容可以让您更接近您想要的内容。
您可能可以使用perldsc
的复习来详细了解复杂数据结构。
use strict;
use warnings;
my $header = <DATA>;
chomp $header;
my @headers = split /,/, $header;
my @records;
while (<DATA>) {
chomp;
my @cols = split /,/;
my %hash;
@hash{@headers} = map [$_], @cols;
push @records, \%hash;
}
use Data::Dump;
dd \@records;
__DATA__
id,name,title,rating
123,Andrew,Book 1,3
1221,Abraham,Book 2,4
43,Annie,Book 3,1
输出:
[
{ id => [123], name => ["Andrew"], rating => [3], title => ["Book 1"] },
{ id => [1221], name => ["Abraham"], rating => [4], title => ["Book 2"] },
{ id => [43], name => ["Annie"], rating => [1], title => ["Book 3"] },
]
答案 1 :(得分:0)
review => [
{
id => [ 123 ],
name => [ Andrew ],
title => [ "Book 1" ],
rating => [ 3 ],
},
'123' => {
'name' => 'Andrew',
'title' => 'Book 1',
'id' => '123',
'rating' => '3',
},
my %h = map { $_ => $array[$index++]} split( ",", $labels );
to
my %h = map { $_ => @{$array[$index++]}} split( ",", $labels );
自从我触及perl以来已经好几年了,所以语法可能已经过时了,但要点是你想要将生成的值放入数组中,然后将其全部包含在内数组