##
use strict;
use warnings;
use XML::Writer;
use IO::File;
use Data::Dumper;
my $CSVfile="1.csv";
my $xmlFile="1.xml";
print "Input Csv file: $CSVfile and Output XML: $xmlFile\n";
my $output = IO::File->new(">$xmlFile");
my $writer = XML::Writer->new(
OUTPUT => $output,
DATA_MODE => 'true',
UNSAFE => 1,
DATA_INDENT => 6
);
$writer->xmlDecl("UTF-8");
my $rootTag="row";
my ($arrRef,$keys)= convertCsvToHash($CSVfile);
for my $hash(@$arrRef){
writeXML($writer,$hash,$rootTag);
}
$writer->end();
$output->close();
sub writeXML{
my ($writer,$hash, $tagname, %attrs) = @_;
$writer->startTag( $tagname, %attrs );
if (ref $hash eq "HASH" ){
for my $key(@$keys){
writeXML($writer,$hash->{$key},$key);
}
}else{
$writer->characters($hash);
}
$writer->endTag($tagname);
}
sub convertCsvToHash{
my $file = shift;
open(FILE, "$file");
my @arr = ;
close(FILE);
my @hashArry;
chomp($arr[0]);
my @keys = split(',',$arr[0]);
my @ke=my ($key1, $key2) = @keys[1,3];
for my $i(1..$#arr){
chomp($arr[$i]);
my @splitRec = split(',',$arr[$i]);
my $hash = {};
push (my @push, ($splitRec[1],$splitRec[3]));
if ($push[1] ne 0) {
for my $j(0..$#ke){
$hash->{$ke[$j]} = $push[$j];
}
push @hashArry,$hash;
}
}
return \@hashArry, \@ke;
}
##
##
X
1111
Z
2222
##
##
Sample XML
Company
Phone
X
1111
Z
222