0

私はこのようなCSVファイルを持っています:

name,email,salary
a,b@b.com,1000
d,e@e.com,2000

今、私はこれをPerlのハッシュマップの配列に変換する必要があるので、次のようなことをすると:

table[1]{"email"}

e@e.comを返します。

私が書いたコードは:

open(DATA, "<$file") or die "Cannot open the file\n";
    my @table;

    #fetch header line
    $line = <DATA>;
    my @header = split(',',$line);

    #fetch data tuples
    while($line = <DATA>)
    {
        my %map;
        my @row = split(',',$line);
        for($index = 0; $index <= $#header; $index++)
        {
            $map{"$header[$index]"} = $row[$index];
        }
        push(@table, %map);
    }
    close(DATA);

しかし、私は望ましい結果を得ていません..あなたは助けることができますか?前もって感謝します...

4

3 に答える 3

5

この行

push(@table, %map)

する必要があります

push(@table, \%map)

あなたtableはハッシュ参照のリストになりたいです。コードは、各キーと値を%map個別の要素としてリストに追加します。

于 2013-03-25T13:51:26.730 に答える
4

ここで車輪の再発明をする必要はありません。Text::CSVモジュールを使用してこれを行うことができます。

#!/usr/bin/perl

use strict;
use warnings;
use v5.16;
use Text::CSV;

my $csv = Text::CSV->new;
open my $fh, "<:encoding(utf8)", "data.csv" or die "data.csv: $!";
$csv->column_names( $csv->getline ($fh)  );
while (my $row = $csv->getline_hr ($fh)) {
    say $row->{email};
}
于 2013-03-25T13:57:40.993 に答える
2

おそらくこのようなもの:

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

my @table;

chomp(my $header = <DATA>);
my @cols = split /,/, $header; # Should really use a real CSV parser here

while (<DATA>) {
  chomp;
  my %rec;
  @rec{@cols} = split /,/;
  push @table, \%rec;
}

say $table[1]{email};

__END__
name,email,salary
a,b@b.com,1000
d,e@e.com,2000
于 2013-03-25T13:58:18.827 に答える