我是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