1

Text::CSV::Slurpハッシュの配列から CSV ファイルを作成するために使用しています。一部のヘッダーが欠落していることを除いて、うまく機能します。

hash1    
    header1 header2
    1          2

hash2
    header1 header2 header3
    11        22       33

最終出力を CSV ファイルにしたい:

header1 header2 header3
1          2
11         22      33

丸呑み出力ではありません

header1 header2
1          2
11         22

助言がありますか?

コード:

sub entry_capture_csv {
my ($stores_folder, $cmdstr, $header_field, $entrycmdstr, $entryfilename) = @_;

print "\t\tOSSI-" . $cmdstr . " for " . $entryfilename . " entry detail\n";
$node->pbx_command($cmdstr);
if ( $node->last_command_succeeded() ) {
    my @ossi_output = $node->get_ossi_objects();
    my $i = 0;
    my @ext_array;
    foreach my $hash_ref(@ossi_output) {
        $i++;
        #print "output result $i\n";
        for my $field ( sort keys %$hash_ref ) {
            my $value = $hash_ref->{$field};
            #print "\t$field => $value\n";
        }
        my $entryNumber = trim($hash_ref->{$header_field});
        unless( defined $entryNumber ) { $entryNumber = '' };
        if ($entryNumber eq "") {
            #empty string
        } else {
            push(@ext_array, $entryNumber);
        }
    }

    # Issue = failed sometimes there is extra header
    #
    my @result_array;

    foreach (@ext_array) {
        my $entrycmd =  $entrycmdstr . " " . $_;
        $node->pbx_command($entrycmd);

        if ( $node->last_command_succeeded() ) {
            print "\t\t\t" . $entrycmd . "\n";

            my @ossi_output = $node->get_ossi_objects();
            push(@result_array, @ossi_output);

            #my $csv = Text::CSV::Slurp->create( input => \@ossi_output );
            #open (OUTFILE, ">$stores_folder/$store-" . $entryfilename . "-" . "$_" . ".csv") || die "Can't open output file.\n";
            #print OUTFILE $csv;
            #close(OUTFILE);

        } else {
            print "Failed\t\t\t" . $entrycmd . "\n";
        }
    }

    my $csv = Text::CSV::Slurp->create( input => \@result_array );
    open (OUTFILE, ">$stores_folder/$store-" . $entryfilename . ".csv") || die "Can't open output file.\n";
    print OUTFILE $csv;
    close(OUTFILE);
}

}

4

1 に答える 1

0

Text::CSV::Slurp->createコンストラクター メソッドは、使用するハッシュ要素のキーと CSV レコード内での順序を定義するオプションを取りますfield_order

このコードを見てください。一目瞭然だと思います。

use strict;
use warnings;

use Text::CSV::Slurp;

my @data = (
  {
    header1 => 1,
    header2 => 2,
  },
  {
    header1 => 11,
    header2 => 22,
    header3 => 33,
  },
);

my $csv = Text::CSV::Slurp->create(
    input => \@data,
    field_order => [qw/ header1 header2 header3 /]);

print $csv;

出力

header1,header2,header3
1,2,
11,22,33

アップデート

データからのヘッダーのリストの取得を自動化するには、次のように記述できます。出力は、前のプログラムの出力と同じです。

ヘッダーのリストをソートする最善の方法を知る方法がないことに注意してください。そのため、単純な字句ソートを使用しました。この些細なデータで目的の効果が得られます。

use strict;
use warnings;

use Text::CSV::Slurp;

my @data = (
  {
    header1 => 1,
    header2 => 2,
  },
  {
    header1 => 11,
    header2 => 22,
    header3 => 33,
  },
);

my @headers = do {
  my %headers;
  $headers{$_}++ for map { keys %$_ } @data;
  sort keys %headers;
};

my $csv = Text::CSV::Slurp->create(
    input => \@data,
    field_order => \@headers);

print $csv;
于 2012-07-02T16:21:19.827 に答える