これは Perl のデータ構造に関する質問ですが、まず関連する詳細について簡単に説明します。DBI を使用し、mysql データベース ($q1 $q2 $q3) に対して 3 つのクエリを実行する perl スクリプトがあります。各クエリは、2 つまたは 3 つのフィールド (要件に応じて変更される可能性があります) と任意の数の行を返します。私の最終的な出力は、すべてのフィールドとその値の csv である必要があります。
以下は、データベースから返されるフィールドと行を表しています。
$q1 が返された場合
field1 field2
id1 val_a
id2 val_w
$q2
field3 #note $q2 has returned one row
000
$q3
field4 field5 field6
val_b val_c val_d
val_x val_y val_z
次に、csvは
field1,field2,field3,field4,field5,field6
id1,val_a,000,val_b,val_c,val_d
id2,val_w,,val_x,val_y,val_z
このような配列のハッシュでデータを収集しようとしました
my @statements = ($q1,$q2,$q3);
my %HoA;
for (@statements) {
my $sth = $dbh->prepare($_);
$sth->execute;
my $i=0;
while(my @row = $sth->fetchrow_array) {
push ( @{ $HoA{$i} }, @row[0..$#row] );
$i++;
}
}
私はまだ学習中なので、これが最良の選択であったかどうかはわかりませんが、1 つ以上のクエリが他のクエリよりも少ない行を返す場合を除いて、私にとってはうまくいきました。これは、上記のフィールドと行の例に示されています戻ってきた。これにより、データ構造が壊れ、行が互いに衝突します。内部ハッシュのキーのフィールドを使用して、ハッシュのハッシュも試しました
my @statements = ($q1,$q2,$q3);
my %HoH;
for (@statements) {
my $sth = $dbh->prepare($_);
$sth->execute;
my $fields_ref = $sth->{NAME_lc};
my $i=0;
while(my @row = $sth->fetchrow_array) {
my $v=0;
for my $field (@$fields_ref) {
$HoH{$i}{$field}=$row[$v];
$v++;
}
$i++;
}
}
これは別の問題に遭遇します。存在しない行のフィールドの内部キーは作成されません。したがって、Data::Dumper を使用した印刷 (私の質問の冒頭の例) は次のようになります。
'0' => {
'field1' => 'id1',
'field2' => 'val_a',
'field3' => '000',
'field4' => 'val_b',
'field5' => 'val_c',
'field6' => 'val_d',
},
'1' => {
'field1' => 'id2',
'field2' => 'val_w', # no field3
'field4' => 'val_x',
'field5' => 'val_y',
'field6' => 'val_z',
},
だから私はちょっと立ち往生していて、次に何を試すべきかわからない. field3 のキーを保持し、それにnull
値のようなものを与える方法があるのではないでしょうか? 何か助けてください。