2015-06-04 3 views
1

Я начинаю использовать Perl для своих скриптов. Прямо сейчас у меня есть хранилище хэш-таблицы для переменной ($XML), но я не знаю, как ее преобразовать в файл CSV. Вот содержание хеш-таблицы.Как преобразовать хеш-таблицу в файл CSV на Perl?

$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 

Не могли бы вы предоставить образец детали, чтобы я мог узнать об этом?

+1

Замечу - если это в XML в первую очередь, могут быть лучшие способы сериализации данных при анализе XML. – Sobrique

+0

Это может быть XML :: Simple output @Sobrique. – simbabque

+0

Да, возможно. Это плохая новость, учитывая, что XML прикладывается к массивам, когда в принципе, XML не поддерживает массивы. Но такие вещи, как 'XML :: Twig', позволяют устанавливать обработчики элементов, которые будут« делать вещи », чтобы транспонировать ваш XML в вывод CSV-стиля. – Sobrique

ответ

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

Я asuming вы знаете, как open файл для записи. Если вы хотите делать более сложные вещи с помощью CSV, используйте Text::CSV, который является отличным обработчиком CSV, который отнимает много боли.

Отъезд perlreftut для получения дополнительной информации о том, как работать со ссылками.

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, 
+0

Как будет выглядеть 'grep' с регулярным выражением? Это может иметь смысл, если вы не знаете, есть ли все ключи, но тогда конкатенация приведет к непоследовательным CSV-данным. Также запятая в конце неверна, поскольку она вводит дополнительный пустой столбец в файл CSV. – simbabque

Смежные вопросы