2014-01-29 51 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 
); 
相关问题