2012-07-02 41 views
1

我使用Text::CSV::Slurp從一個哈希數組創建一個CSV文件。除了某些標題丟失以外,它工作得很好。使用Perl模塊丟失標題Text :: CSV :: Slurp

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

}

+0

也許你應該顯示你的代碼。 – TLP

回答

0

Text::CSV::Slurp->create構造方法需要一個field_order選項,它定義將要使用的哈希元素的密鑰和它們在CSV記錄順序。

看看這個代碼,我認爲這是不言自明的。

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; 
+0

感謝鮑羅廷。我可以通過我的散列數組來做類似循環的操作,爲每個散列獲取所有標題,刪除重複項,並將它們分配給field_order?有沒有更好的辦法? – user1496482

+0

@ user1496482:我已添加到我的答案中,以顯示如何自動生成所有散列鍵的列表。 – Borodin

+0

酷豆。它正在工作。非常感謝鮑羅廷。 – user1496482