perl <<'EOF'
use warnings;
use strict;
use XML::LibXML;
my($data) = './work/data.xml';
my($file) = './out/data.csv';
open(my $out, '>', $file) or die "Could not open file '$file' $!";
my($parser) = XML::LibXML->new();
my $xmldata = $parser->parse_file($data);
my @childarray;
#The first 2 loop blocks print column headings
#Dimensions
###########################
#Fixed Date Heading
###########################
push( @childarray, qq("WTDate"));
for my $node ( $xmldata->findnodes( '/DimensionalReport/ReportDefinition/list/Dimension' )) {
for my $dimension ($node->findnodes('*[2]')) {
my $child = $dimension->to_literal;
if ($dimension->nodeName eq "string") {
$child = qq("$child");
}
push( @childarray, $child);
}
}
#Measures
for my $node ( $xmldata->findnodes( '/DimensionalReport/ReportDefinition/list/Measure' )) {
for my $measure ($node->findnodes('*[1]')) {
my $child = $measure->to_literal;
if ($measure->nodeName eq "string") {
$child = qq("$child");
}
push( @childarray, $child);
}
}
print $out join(",", @childarray), "\n";
undef @childarray;
#Print Data
#Records
for my $node ( $xmldata->findnodes( '/DimensionalReport/list/DataRow' )) {
for my $lvldim ($node->findnodes('./list/list/DataRow')) {
my $dim1 = $node->getAttribute("name");
if ($node->nodeName eq "string" or $node->nodeName eq "list") {
$dim1 = qq("$dim1");
}
push( @childarray, $dim1);
my $child = $lvldim->getAttribute("name");
if ($lvldim->nodeName eq "string" or $lvldim->nodeName eq "list") {
$child = qq("$child");
}
push( @childarray, $child);
for my $lvlmeas ($lvldim->findnodes('./list/*')) {
my $child = $lvlmeas->to_literal;
if ($lvlmeas->nodeName eq "string" or $lvlmeas->nodeName eq "list") {
$child = qq("$child");
}
push( @childarray, $child);
}
print $out join(",", @childarray), "\n";
undef @childarray;
}
}
close $out;
EOF
}
####
"Time Period","Active Visits","Page Views","Clickthroughs","Daily Visitors","Weekly Visitors","Monthly Visitors","Quarterly Visitors","Yearly Visitors","Single Page View Visits","Entry Page Visits","Bounce Rate"
1/1/2013,9609.00,36456.00,604.00,9265.00,8948.00,9265.00,9265.00,9265.00,4444.00,9608.00,46.25
1/2/2013,22088.00,76762.00,10291.00,21460.00,21088.00,21263.00,21263.00,21263.00,12022.00,22054.00,54.51
####
"WTDate","DMA","Most Recent Campaign Demand Channel","Most Recent Campaign Partner","Most Recent Campaign Marketing Program","Most Recent Campaign Marketing Activity","Most Recent Campaign Description","Most Recent Campaign ID","Visits","Page Views","Clickthroughs","Orders","Revenue","Average Revenue per Order","Units","Average Units per Order","Average Visit Duration (Minutes)","Average Visit Page Views","Hits","Daily Campaign Visitors","Weekly Campaign Visitors","Monthly Campaign Visitors","Quarterly Campaign Visitors","Yearly Campaign Visitors","New Campaign Visitors"
2013-01-01,"500 (Portland-Auburn:ME-NH)","online","null","null","null","null","ban_384938",384,4859,38,3,4958,50.00,4,2,2.3,3.1,3844,200,400,500,593,2,203
2013-01-01,"500 (Portland-Auburn:ME-NH)","online","null","null","null","null","ban_384950",390,4859,38,3,4958,50.00,4,2,2.3,3.1,3844,200,400,500,593,2,203
2013-01-01,"501 (New York:CT-NJ-NY-PA)","online","null","null","null","null","ban_384950",35,200,38,3,4958,50.00,4,2,2.3,3.1,3844,200,400,500,593,2,203