2014-01-29 50 views
0

你好我正在通過PERL從XMLRPC API檢索數據,並最終得到一個HASH(實際上我相信這裏的正確術語應該是數組中的數組),我部分想將其轉換爲CSV文件。如何將多維HASH轉換爲PERL中的CSV文件?

如這裏的基本概述是我在做什麼:

my $server = XMLRPC::Lite 
    ->proxy('https://myhost/api'); 
my $session = $server->login(foo) 
    ->result; 
my @tempArr = $server->call(foobar)->result; 

事後:

print @tempArr; 

結果:

HASH(0x23c0330) 

如果我傾倒通過數據計算散列內容:: Dumper:

print Dumper(\@tempArr); 

然後我收到陣列的結構如下:

$VAR1 = [ 
     { 
     'table' => [ 
        [ 
        'abc', 
        'def', 
        'ghi', 
        'jkl' 
        ], 
        [ 
        'abc', 
        'def', 
        'fed', 
        'cba' 
        ], 
       ], 
     'columns' => [ 
        'field1', 
        'field2', 
        'field3', 
        'field4', 
        ] 
     } 
    ]; 

現在我想從「表」的所有項目寫入一個CSV文件格式化。所以基本上在這種情況下:

abc,def,ghi,jkl 
abc,def,fed,cba 

我用文字:: CSV :: Slurp的玩弄了一會兒,但並沒有真正理解如何處理它的陣列陣列內:

my $csv = Text::CSV::Slurp->create(input => \@tempArr); 
my $file = "/path/output.csv"; 
open(FH, ">$file") || die "Couldn't open $file $!"; 
print FH $csv; 
close FH; 

我只是想出了以下內容的csv文件:

columns,table 
ARRAY(0x23c01b0),ARRAY(0x25a944c) 

對如何處理這個問題的任何建議,將不勝感激。目前我已經決定回顧一下PERL中的數組和哈希,因爲我似乎對這個問題缺乏很多基本的理解。

+0

'print $ tempArr;'nothing nothing用@ tempArr做的事情。你確定你發佈了正確的代碼嗎? – cjm

+0

Woopsy,這是我的代碼片斷中的一個錯字。謝謝你指出。我現在糾正了它! – user3248687

回答

1

文字:: CSV ::啜食下列格式的arrayrefs(無論是如何分析和操作如何才能寫回CSV :)

$VAR1 = [ { field1 => 'abc', 
      field2 => 'def', 
      field3 => 'ghi', 
      field4 => 'jkl', 
      }, 
      { field1 => 'abc', 
      field2 => 'def', 
      field3 => 'fed', 
      field4 => 'cba', 
      }, 
    ]; 

將您的響應到該類型的格式。

由於它現在運行,Text :: CSV :: Slurp將表和列的第一級鍵視爲數據字段名稱,然後將包含的arrayrefs字符串化並將它們用作值。

0

這將直接從數據結構產生CSV文件:

for my $arr (@{$$VAR1[0]{'table'}}) { 
    my $last_elem = pop(@$arr); 
    for my $elem (@$arr) { print("$elem,"); } 
    print("$last_elem\n"); 
} 
+1

你可以簡單地'print join(',',@ $ arr),「\ n」;'來代替'最後一個元素'彈出'並遍歷數組的其餘元素。但是,如果任何元素包含逗號,則仍不會生成有效的CSV。也不會打印列標題。使用Text :: CSV會更好。 – ThisSuitIsBlackNot

1

似乎結果()返回一個散列引用不是一個數組,從而改變該行:

my $result = $server->call(foobar)->result; 

然後將結果轉換爲Text :: CSV所需的格式:: Slurp

my $cols = $result->{'columns'}; 
my $rows = $result->{'table'}; 
my @idx = 0 .. @$cols - 1; 
my @array_of_hashes; 
for my $row (@$rows) { 
    my %hash = map { $cols->[$_] => $row->[$_] } @idx; 
    push(@array_of_hashes,\%hash); 
} 
my $csv = Text::CSV::Slurp->create(
    input => \@array_of_hashes, 
    field_order => $cols 
); 
相關問題