0

Perl を使用して、csv の次のスニペットをハッシュに変換する際に問題があります。

emp_no,birth_date,first_name,last_name,gender,hire_date
10001,1953-09-02,Georgi,Facello,M,1986-06-26
10002,1964-06-02,Bezalel,Simmel,F,1985-11-21
10003,1959-12-03,Parto,Bamford,M,1986-08-28
10004,1954-05-01,Chirstian,Koblick,M,1986-12-01
10005,1955-01-21,Kyoichi,Maliniak,M,1989-09-12

ハッシュは次のようになります。

$employee = {
emp_no=>[10001,10002,10003,10004,10005],
birth_date=>[1953-09-02,1964-06-02,1959-12-03],
simarly for fistname , lastname and hire_date

}

私はこのように試しました

while(<FH>){


    @keys = split /,/,$_ if $.==1;  #for the first line 

       @row = split /,/,$_;

          push @hash{@keys},@row;

}
4

3 に答える 3

2

これは、何らかの理由でhttp://metacpan.org/pod/Text::CSVモジュールを使用できない場合にのみ使用して ください :)

my %employee;
while (<ARGV>)) {
  next if /^emp/;
  my @r = split/,/; 
  push @{$employee{$_}}, shift @r 
       for qw(emp_no birth_date first_name last_name gender hire_date);   
}
于 2013-06-25T21:30:26.260 に答える
1

何かのようなもの:

while ( my $line = readline($fh) ) {
    chomp $line;
    my ( $emp_no, $birth_date, $first_name, $last_name, $gender, $hire_date ) = split /,/, $line;
    push @{ $employee->{emp_no} }, $emp_no;
    #etc.
}
于 2013-06-25T19:04:56.277 に答える
0

Text::CSV は、各ハッシュ キーが列名であるハッシュの配列としてデータを保存します。これが一番理にかなっている気がします。例えば:

my %employee =  %{ $employee_array[2] };  #Row #3 of your file:
print "The name of the third employee is $employee{first_name} $employee{last_name}\n";

したがって、配列の 1 つの行には、その従業員のすべてのデータが含まれます。

あなたの場合、複数の配列でインデックスを同じに保つ必要があります。

print "The name of the third employee is $first_name[2] $last_name[2]\n";

従業員を操作する関数がある場合は、すべての配列を関数に渡す必要があります。

print_paycheck($first_name[1], $last_name[1], $employee_num[1], $hire_date[1]...);

一方、ハッシュの配列がある場合は、次のようにすることができます。

print_paycheck($employee_array[1]);

あなたは参照について知らないと思います。Perl の初心者向けの本の多くは、それらについて説明していません。また、Perl の明らかな拡張機能でもありません。ただし、参照を使用すると、これらのより複雑なデータ構造を作成できます。幸いなことに、Perldoc には優れたTutorialがあります。読むことをお勧めします。

実際には、おそらく従業員番号をキーにしたデータを保存したいので、ハッシュのハッシュが必要です。

ハッシュのハッシュの例を次に示します。:これは私がプログラムを行う方法ではありません。まず、Text::CSV可能であればそれを使用し、次に実際にオブジェクト指向のアプローチを使用します。ただし、これをハッシュの単純なハッシュとして保持したかった:

use warnings;
use strict;
use feature qw(say);

use Data::Dumper;

my %employee_hash;
<DATA>;  #Field Names
while ( my $employee_data = <DATA> ) {
    chomp $employee_data;
    my ($employee, $birth_date, $first_name, $last_name, $gender, $hire_date) = split /,/, $employee_data;
    $employee_hash{$employee}->{birth_date} = $birth_date;
    $employee_hash{$employee}->{first_name} = $first_name;
    $employee_hash{$employee}->{last_name}  = $last_name;
    $employee_hash{$employee}->{gender}     = $gender;
    $employee_hash{$employee}->{hire_date}  = $hire_date;
}

for my $employee ( sort keys %employee_hash ) {
    my $gender;
    if ( $employee_hash{$employee}->{gender} eq "M" ) {
        $gender = "he";
    }
    else {
        $gender = "she";
    }

    printf qq(Employee: %s is %s %s and %s was hired on %s\n),
        $employee,
        $employee_hash{$employee}->{first_name},
        $employee_hash{$employee}->{last_name},
        $gender,
        $employee_hash{$employee}->{hire_date};
}

__DATA__
emp_no,birth_date,first_name,last_name,gender,hire_date
10001,1953-09-02,Georgi,Facello,M,1986-06-26
10002,1964-06-02,Bezalel,Simmel,F,1985-11-21
10003,1959-12-03,Parto,Bamford,M,1986-08-28
10004,1954-05-01,Chirstian,Koblick,M,1986-12-01
10005,1955-01-21,Kyoichi,Maliniak,M,1989-09-12
于 2013-06-26T16:55:21.613 に答える