如何在Perl上将哈希表转换为CSV文件?

如何在Perl上将哈希表转换为CSV文件?,perl,csv,Perl,Csv,我是使用perl编写脚本的初学者。现在我在变量($XML)上有一个哈希表存储,但我不知道如何将其转换为CSV文件。下面是哈希表的内容 $VAR1 = { 'result' => { 'item' => [ { 'bootbox8_id' => '222333',

我是使用perl编写脚本的初学者。现在我在变量(
$XML
)上有一个哈希表存储,但我不知道如何将其转换为CSV文件。下面是哈希表的内容

$VAR1 = {
      'result' => {
                  'item' => [
                            {
                              'bootbox8_id' => '222333',
                              'site_id' => '144',
                              'key' => '0',
                              'os_version' => '3.1',
                              'switch_name' => 'switch1.name.com',
                              'type_id' => '109',
                              'mac' => {
                                       'item' => {
                                                 'content' => '00:B0:92:2C:CB:9D',
                                                 'key' => '0'
                                               }
                                     },
                              'property' => 'SALES',
                              'console' => 'console.name.com',
                              'name' => 'india2.name.com',
                              'bootbox8' => 'console.name.com',
                              'os_name' => 'LINUX',
                              'site' => 'india',
                              'manufacturer' => 'XXX',
                              'model' => 'XXX-4',
                              'id' => '1083376',                                  
                            },
                            {
                              'bootbox2_id' => '222333',
                              'site_id' => '144',
                              'key' => '1',
                              'os_version' => '3.1',
                              'switch_name' => '',
                              'type_id' => '109',
                              'mac' => {
                                       'item' => {
                                                 'content' => '00:B0:98:1B:C6:E2',
                                                 'key' => '0'
                                               }
                                     },
                              'property' => 'SALES',
                              'console' => 'console.name.com',
                              'name' => 'india1.name.com',
                              'bootbox2' => 'console.name.com',
                              'os_name' => 'LINUX',
                              'site' => 'india',
                              'manufacturer' => 'XXX',
                              'model' => 'XXX-4',
                              'id' => '1083377',                                
                            }
                          ]
                },
      'meta' => {
                'total_pages' => '1',
                'current_page' => '1',
                'per_page' => '10',
                'total' => '2'
              }
    };
我想收集一些散列表上的字段并转换成CSV文件,如下所示

india2.name.com,SALES,india,LINUX,XXX-4
india1.name.com,SALES,india,LINUX,XXX-5

您能否提供详细的示例,以便我了解这一点?

您需要对数据进行迭代。实际项目位于
$XML->{result}->{item}
中。您需要使用
@{}
取消引用。每个项目都是一个简单的hashref。您可以通过使用所需的键来加入数据

foreach my $item ( @{$XML->{result}->{item}} ){
    say join ',', $item->{name}, $item->{property}, $item->{site}, $item->{os_name}, $item->{model};
}
如果您想让它稍微短一点,可以使用hashref切片

foreach my $item ( @{$XML->{result}->{item}} ){
    say join ',', @{$item}{qw(name property site os_name model)};
}
我想你知道如何
打开
文件进行写作。若你们想用CSV做更复杂的事情,那个就使用它,它是一个优秀的CSV处理程序,可以消除很多麻烦


查看有关如何使用引用的更多信息。

这可能是一个更简单的解决方案,您可以从中更好地了解如何在perl中处理哈希数组…:

my $XML = {
      'result' => {
                  'item' => [
                            {
                              'bootbox8_id' => '222333',
                              'site_id' => '144',
                              'key' => '0',
                              'os_version' => '3.1',
                              'switch_name' => 'switch1.name.com',
                              'type_id' => '109',
                              'mac' => {
                                       'item' => {
                                                 'content' => '00:B0:92:2C:CB:9D',
                                                 'key' => '0'
                                               }
                                     },
                              'property' => 'SALES',
                              'console' => 'console.name.com',
                              'name' => 'india2.name.com',
                              'bootbox8' => 'console.name.com',
                              'os_name' => 'LINUX',
                              'site' => 'india',
                              'manufacturer' => 'XXX',
                              'model' => 'XXX-4',
                              'id' => '1083376',
                            },
                            {
                              'bootbox2_id' => '222333',
                              'site_id' => '144',
                              'key' => '1',
                              'os_version' => '3.1',
                              'switch_name' => '',
                              'type_id' => '109',
                              'mac' => {
                                       'item' => {
                                                 'content' => '00:B0:98:1B:C6:E2',
                                                 'key' => '0'
                                               }
                                     },
                              'property' => 'SALES',
                              'console' => 'console.name.com',
                              'name' => 'india1.name.com',
                              'bootbox2' => 'console.name.com',
                              'os_name' => 'LINUX',
                              'site' => 'india',
                              'manufacturer' => 'XXX',
                              'model' => 'XXX-4',
                              'id' => '1083377',
                            }
                          ]
                },
      'meta' => {
                'total_pages' => '1',
                'current_page' => '1',
                'per_page' => '10',
                'total' => '2'
              }
    };

foreach my $item (@{$XML->{result}->{item}}) {
  for $key ( keys %{ $item } ) {
    if (grep( /^$key$/, qw(name property site os_name model))) {
      print $XML->{'result'}->{'item'}->[$i]{$key} . ",";
    }
  }
  print "\n";
}
产生:

india2.name.com,SALES,india,LINUX,XXX-4,
india1.name.com,SALES,india,LINUX,XXX-5,

我要注意-如果它首先是XML格式的,那么在解析XML时可能有更好的方法序列化数据。这可能是XML::Simple output@Sobrique。是的,可能是这样。这是个坏消息,因为XML在基本上不支持数组的情况下被强制转换为数组。但是像
XML::Twig
这样的东西可以让您设置元素处理程序,这些处理程序将“做一些事情”将XML转换为CSV样式的输出。使用正则表达式的
grep
如何更简单?如果您不知道是否所有的键都在那里,那么这可能是有意义的,但是连接将导致不一致的CSV数据。最后的逗号也是错误的,因为它在CSV文件中引入了一个额外的空列。