使用Perl将CSV数据转换为哈希

时间:2014-06-20 05:35:28

标签: perl csv hash

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

2 个答案:

答案 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以来已经好几年了,所以语法可能已经过时了,但要点是你想要将生成的值放入数组中,然后将其全部包含在内数组