你好我正在通过PERL从XMLRPC API中检索数据,最后得到一个HASH(实际上我相信这里的正确术语是阵列中的数组),我部分想要转换成CSV文件。
这里的基本概述是我正在做的事情:
my $server = XMLRPC::Lite
->proxy('https://myhost/api');
my $session = $server->login(foo)
->result;
my @tempArr = $server->call(foobar)->result;
之后a:
print @tempArr;
结果:
HASH(0x23c0330)
如果我通过Data :: Dumper转储HASH内容:
print Dumper(\@tempArr);
然后我收到了数组的以下结构:
$VAR1 = [
{
'table' => [
[
'abc',
'def',
'ghi',
'jkl'
],
[
'abc',
'def',
'fed',
'cba'
],
],
'columns' => [
'field1',
'field2',
'field3',
'field4',
]
}
];
现在我想将'table'中的所有项目写入CSV格式文件。所以基本上在这种情况下:
abc,def,ghi,jkl
abc,def,fed,cba
我正在玩Text :: 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 :(得分:1)
Text :: CSV :: Slurp对以下格式的arrayrefs进行操作(包括它如何解析以及写回CSV所需的内容)。
$VAR1 = [ { field1 => 'abc',
field2 => 'def',
field3 => 'ghi',
field4 => 'jkl',
},
{ field1 => 'abc',
field2 => 'def',
field3 => 'fed',
field4 => 'cba',
},
];
将您的回复转换为该类型的格式。
现在,Text :: CSV :: Slurp将表和列的第一级键视为数据字段名称,然后对包含的arrayrefs进行字符串化并将它们用作值。
答案 1 :(得分:1)
似乎result()返回的是哈希引用而不是数组,因此请将该行更改为:
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
);
答案 2 :(得分:0)
这将直接从您的数据结构生成您的csv文件:
for my $arr (@{$$VAR1[0]{'table'}}) {
my $last_elem = pop(@$arr);
for my $elem (@$arr) { print("$elem,"); }
print("$last_elem\n");
}