Just to make a minor point (plus get my first post in for 2003! ;)), the original poster's data has semicolons as the separating character instead of the default comma, which can easily be specified in Text::CSV_XS's sep_char attribute in the new() method. Hope I'm not doing anyone's homework:
#!/usr/bin/perl -w
use strict;
use Text::CSV_XS;
my ( $csv, $xml );
$csv = Text::CSV_XS->new( {
'sep_char' => ';'
} );
$xml = '';
while( <DATA> ) {
chomp;
if ( $csv->parse( $_ ) ) {
my ( $line, $n, @fields, $field );
$line = '<row>';
$n = 1;
@fields = $csv->fields();
foreach $field ( @fields ) {
$line .= "<col$n>$field</col$n>";
$n++;
}
$xml .= $line . "</row>\n";
} else {
print "parse() failed on this line: " . $csv->error_input() .
+"\n";
# die?
}
}
print $xml;
__DATA__
a;b;c;d;e
f;g;h;i
j;k
l
m;n;o
Output:
$ ./main.pl
<row><col1>a</col1><col2>b</col2><col3>c</col3><col4>d</col4><col5>e</col5></row>
<row><col1>f</col1><col2>g</col2><col3>h</col3><col4>i</col4></row>
<row><col1>j</col1><col2>k</col2></row>
<row><col1>l</col1></row>
<row><col1>m</col1><col2>n</col2><col3>o</col3></row>
There's probably an XML package out there should your required output become more complex or you want to guarantee that you are using a standardized and optimized solution.
Peace,
Purdy |