Wie generiere ich aus einer CSV-Datei eine XML-Datei?
Inhalt:
Häufig hat man Daten als CSV-Datei vorliegen. Sei es ein Dump einer Datenbank
oder ein Export von Excel. Zum Datenaustausch zwischen Unternehmen oder zwischen
Abteilungen werden häufig XML-Dateien verlangt. Doch wie bekomme ich jetzt die
Daten der CSV-Datei in eine XML-Datei.
Dafür gibt es wieder jede Menge unterschiedliche Wege (typisch Perl:
TIMTOWTDI)!
Ich zeige erstmal einen möglichen Weg mit DBI (und DBD::CSV) als Modul für die CSV-Datei
und XML::Writer für die Generierung der XML-Datei.
DBI und XML::Writer
#! /usr/bin/perl
use strict;
use warnings;
use DBI;
use XML::Writer;
use IO::File;
my $output = new IO::File(">output.xml"); die $! unless($output);
my $writer = new XML::Writer(OUTPUT => $output);
my $dbh = DBI->connect("DBI:CSV:f_dir=/path/to/dir/with/csv/;csv_sep_char=\\;") or die $DBI::errstr;
$dbh->{'csv_tables'}->{'info'} = { 'file' => 'info2.csv'};
my $sth = $dbh->prepare("SELECT * FROM info");
$sth->execute();
my @names = @{$sth->{NAME}};
$writer->startTag('Entries');
while(my @row = $sth->fetchrow_array()) {
$writer->startTag('Entry');
$writer->characters("\n");
for(0..$#names) {
next unless($names[$_]);
$writer->startTag($names[$_]);
$writer->characters($row[$_]);
$writer->endTag($names[$_]);
$writer->characters("\n");
}
$writer->endTag('Entry');
}
$writer->endTag('Entries');
$sth->finish();
$dbh->disconnect();
$writer->end();
$output->close();
XML::CSV
Ein Beispiel aus der Doku:
use XML::CSV;
my $csv_obj = XML::CSV->new();
my @arr_of_headings = qw(header1 header2);
$csv_obj->{column_headings} = \@arr_of_headings;
$csv_obj->parse_doc("in_file.csv");
$csv_obj->print_xml("out.xml", {format => " ", file_tag = "xml_file", parent_tag => "record"});
Ergänzungen, Kommentare
Kommentare werden am besten in folgender Form vorgenommen, damit
sie im Inhaltsverzeichnis angezeigt werden (natürlich ohne das <verbatim>):
---+++ Main.??? - 14 Jul 2003 - Betreff
-- Main.AlexanderBecker - 29 Jun 2006 Code etwas verschönert