Awk solution
awk -F ',' '{split($4, a, "-"); $4 = (a[3] "/" a[2] "/" a[1])}1' OFS=, file
Не используйте 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?
У меня есть код ниже, для разных наборов 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" ;
}
Но как получить следующие элементы, если у меня есть больше?