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

时间:2015-06-04 08:59:48

标签: perl csv

我是使用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

你能提供详细的样本,以便我可以了解吗?

2 个答案:

答案 0 :(得分:2)

您需要迭代数据。实际项目位于$XML->{result}->{item}。您需要使用@{ }取消引用。每个项目都是一个简单的hashref。您可以使用所需的密钥join获取数据。

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)};
}

我知道如何open写一个文件。如果您想使用CSV执行更复杂的操作,请使用Text::CSV,这是一个优秀的CSV处理程序,将会带来很多痛苦。

查看perlreftut了解有关如何使用参考文献的更多信息。

答案 1 :(得分:1)

这可能是一个更简单的解决方案,您可以从中更好地学习如何处理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,