我是Perl的新手。我正在尝试从CSV文件创建一个哈希。使用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;
您是否正在寻找真正属于'[]'的值,它是perl中的一个匿名数组? – salparadise
我认为你已经比你想要的设计更好。你知道'$ reviews'是一个单元哈希,而且你的哈希值是单元数组吗?因此,要访问第二个评论的'name'字段,您必须编写'$ reviews - > {review} [1] {name} [0]'。除非你需要在同一个结构中存储更多的数据,否则如果'$ reviews'是一个数组引用,并且你的散列值是纯字符串,会不会更好?这样,访问相同的项目看起来就像'$ reviews - > [1] {name}'这样简单得多,不易出错。 – Borodin