简体   繁体   English

使用Perl模块Text :: CSV :: Slurp缺少标题

[英]Missing headers using Perl module Text::CSV::Slurp

I am using Text::CSV::Slurp to create a CSV file from an array of hashes. 我正在使用Text::CSV::Slurp从哈希数组创建CSV文件。 It works great except some headers are missing. 它工作得很好,除了缺少一些标题。

hash1    
    header1 header2
    1          2

hash2
    header1 header2 header3
    11        22       33

I want the final output to be a CSV file: 我希望最终输出是CSV文件:

header1 header2 header3
1          2
11         22      33

not the slurp output 不是slurp输出

header1 header2
1          2
11         22

Any suggestions? 有什么建议么?

code: 码:

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);
}

} }

The Text::CSV::Slurp->create constructor method takes a field_order option which defines the keys of the hash elements to be used and their order in the CSV record. Text::CSV::Slurp->create构造函数方法采用field_order选项,该选项定义要使用的哈希元素的键及其在CSV记录中的顺序。

Take a look at this code, which I think is self-explanatory. 看一下这段代码,我认为这是不言而喻的。

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;

output 输出

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

Update 更新资料

To automate getting a list of headers from the data, you could write something like this. 要自动从数据中获取标头列表,您可以编写如下内容。 The output is identical to that from the previous program. 输出与上一个程序相同。

Note that there is no way of knowing how best to sort the list of headers so I have used a simple lexical sort. 请注意,没有办法知道如何最好地对标题列表进行排序,因此我使用了简单的词法排序。 It produces the desired effect with this trivial data. 利用这些琐碎的数据,它可以产生理想的效果。

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;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM