如何在PERL中将多维HASH转换为CSV文件?

时间:2014-01-29 15:29:54

标签: arrays perl csv hash

你好我正在通过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中的数组和哈希,因为我似乎对这个问题缺乏很多基本的理解。

3 个答案:

答案 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");
}