0

これは 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値のようなものを与える方法があるのではないでしょうか? 何か助けてください。

4

1 に答える 1