Как преобразовать XML-файл в CSV с помощью Perl?

Awk solution

awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file
1
13.04.2017, 15:36
2 ответа

Не используйте XML :: Simple . Это плохая идея .

Но довольно фундаментально - XML ​​- это иерархическая структура данных, а CSV - нет. В результате невозможно решить перевод для общего случая.

Однако, учитывая стандартную структуру записи, это не так уж сложно:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;
use Text::CSV;
use Data::Dumper;

my $twig = XML::Twig->new->parse( \*DATA );

#read heading from first record.
my @headings =
    map { $_->tag } $twig->findnodes( '//accountingRequest', 0 )->children;

my $csv_out = Text::CSV->new( { binary => 1, eol => "\n" } );
$csv_out->print( \*STDOUT, \@headings );

foreach my $accountingRequest ( $twig->findnodes('//accountingRequest') ) {
    my @row = map { $accountingRequest->first_child_text($_) } @headings;
    $csv_out->print( \*STDOUT, \@row );
}

Это извлекает «тег» верхнего уровня, а затем значения, которые им соответствуют, и печатает их.

Это не идеально, потому что, как уже говорилось, ваши данные иерархичны. У вас есть записи cisco , и вам нужно решить, что вы хотите с ними делать - как они должны быть представлены в вашем CSV?

2
27.01.2020, 23:37

У меня есть код ниже, для разных наборов XML-файла в CSV.

код:

#!/usr/bin/perl

# Script to illustrate how to parse a simple XML file
# and pick out all the values for a specific element, in
# this case all the titles.

# use strict;
use XML::Simple;
use Data::Dumper;

# create object
$xml = new XML::Simple (KeyAttr=>[]);

# read XML file
$data = $xml->XMLin("test1.xml");


my $booklist = XMLin('test1.xml');    #booklist is the array 
# print Dumper($booklist);

foreach my $FreemanFees (@{$booklist->{FreemanFees}}) {


    print 
    $FreemanFees->{SdcLoanFacilityNumber} , "," , 
    $FreemanFees->{DealId} ,",", 
    $FreemanFees->{Tranche}->{SdcDealNumber} , "," , 
    $FreemanFees->{Tranche}->{ManagerFeeAndCredits}->{ManagerFeeAndCredit}->{FreemanFeesForManager}->{ManagerNumberForFreemanFee}, ",",
    $FreemanFees->{Tranche}->{ManagerFeeAndCredits}->{ManagerFeeAndCredit}->{FreemanFeesForManager}->{currencyId},",",
    $FreemanFees->{Tranche}->{ManagerFeeAndCredits}->{ManagerFeeAndCredit}->{FreemanFeesForManager}->{sdcCurrencyCode} , "," , 
    $FreemanFees->{Tranche}->{ManagerFeeAndCredits}->{ManagerFeeAndCredit}->{FreemanFeesForManager}->{scale}, ",",
    $FreemanFees->{Tranche}->{ManagerFeeAndCredits}->{ManagerFeeAndCredit}->{FreemanFeesForManager}->{content} , "," ,"\n" ;
    }

Но как получить следующие элементы, если у меня есть больше?

0
27.01.2020, 23:37

Теги

Похожие вопросы