我是使用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
你能提供详细的样本,以便我可以了解吗?
答案 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,