問題は次のとおりです。
push @{hash->{@columnNames}} ,@columnValues;
@columnNames
ハッシュのキーとして使用しようとしています。Perl は自動的にこれをスカラー コンテキストで受け取り、配列に 8 つの値があるため、キーを与えます。8
あなたがしたいことは、CSV の最初の行 (列名を含む) を特別なものとして扱うことです。これは、これらが配列のキーになるためです。
my @column_names = read_csv_row; #Column names
my %employee_hash;
for my $column ( @column_names ) {
$employee_hash{$column} = [];
}
これにより、配列への参照への列名でキー付けされたハッシュが得られます。CSV テーブルの各行を読み取り、各フィールドを正しい列ハッシュにプッシュする必要があります。
while ( my @employee_fields = read_csv_row ) { #Your employee record is in @employee
for my $field_num ( 0..$#employee_fields) {
push @{ $employee_hash{$column_names[$field_num] }, $employee_fields[$field_num];
}
}
これは、CSV 行から各フィールドを取得し、%employee_hash
. @column_names
各行と同じ順序になっていることを利用しています。したがって、$column_names[$field_number]
は正しいハッシュ キーであり、これは$employee_fields[$field_num]
.
ただし、投稿で述べた構造は、おそらくあなたが本当に望んでいるものではありません. あなたが望むのは次のようなものです:
%VAR = {
7839 => {
ENAME => "KING",
JOB => "PRESIDENT",
MGR => "",
HIREDATE => "11/17/1981",
SAL => "5000",
COMM => "",
DEPTNO => "10",
}
}
これにより、従業員番号によって各従業員がキーになり、関連するすべての従業員フィールドがその値の一部になります。次に、従業員番号 7839 の役職は で$employee{7839}->{JOB}
あり、その従業員の名前は であると言えます$employee{7839}->{NAME}
。このようにして、各従業員に関するすべての情報が 1 つのレコードにまとめられます。
use warnings;
use strict;
use Data::Dumper;
use feature qw(say);
my @column_names = read_csv_row(); #Column name
my %employee_hash;
while ( my @minion_fields = read_csv_row() ) { #Your employee record is in @employee
my %minion_hash;
my $minion_number = $minion_fields[0];
for my $field_num ( 1..$#minion_fields) {
$minion_hash{ $column_names[$field_num] } = $minion_fields[$field_num];
}
$employee_hash{$minion_number} = \%minion_hash;
}
sub read_csv_row {
my $row = <DATA> or return;
chomp $row;
return split /,\s+/, $row;
}
say Dumper \%employee_hash;
__DATA__
empno, name, job, mgr, hiredate, sal, comm, deptno
7839, king, president, , 11/17/1981, 5000, , 10
1234, prince, vice-president, , 10/1/1980, 3000, , 10
ちなみに、このコードはまだテストしていません。(今それを行い、必要な修正を行います)。CSV ファイルを読み取るためのより良い方法を試してみたいと思うかもしれませんしText::CSV
、これらの構造を作成するのにも役立つかもしれません (私は長い間使用していないので、その機能のすべてを覚えているわけではありません)。 )。ただし、従業員構造を、従業員番号をキーとする最初のハッシュと、フィールドをキーとするサブハッシュを持つハッシュのハッシュにする方が、配列のハッシュよりもはるかに優れていることがわかると思います。