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