【发布时间】:2014-08-10 19:36:16
【问题描述】:
我是 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 中的匿名数组? -
我认为你已经拥有的比你想要的设计要好得多。您是否意识到
$reviews是一个单元素散列,而您的散列值是单元素数组?因此,要访问第二条评论的name字段,您必须编写$reviews->{review}[1]{name}[0]。除非你有更多的数据需要存储在同一个结构中,否则如果$reviews是一个数组引用并且你的哈希值是纯字符串不是更好吗?这样一来,访问同一个项目看起来就像$reviews->[1]{name},它更简单,更不容易出现错误。