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
나는 당신이 이미 원하는 디자인보다 훨씬 낫다고 생각합니다. ''$ 리뷰 '는 하나의 요소로 구성된 해쉬이고 해시 값은 하나의 요소로 구성된 배열이라는 것을 알고 있습니까? 따라서 두 번째 리뷰의'name' 필드에 액세스하려면'$ reviews -> {review} [1] {name} [0]'이라고 써야합니다. 같은 구조체에 저장할 필요가있는 데이터가 더 많지 않다면'$ reviews'가 배열 참조이고 해쉬 값이 일반 문자열이라면 더 좋지 않을까요? 그렇게하면 동일한 항목에 접근하는 것이'$ reviews -> [1] {name}'처럼 보이고 버그가 훨씬 간단해질 것입니다. – Borodin