.csv
私は以下のような単純なファイルを読み取るPerlスクリプトを持っています-
"header1","header2","header3","header4"
"12","12-JUL-2012","Active","Processed"
"13","11-JUL-2012","In Process","Pending"
"32","10-JUL-2012","Active","Processed"
"24","08-JUL-2012","Active","Processed"
.....
.csv
目的は、これを次の.xml
ようなファイルに変換することです-
<ORDERS>
<LIST_G_ROWS>
<G_ROWS>
<header1>12</header1>
<header2>12-JUL-2012</header2>
<header3>Active</header3>
<header4>Processed</header4>
</G_ROWS>
<G_ROWS>
<header1>13</header1>
<header2>11-JUL-2012</header2>
<header3>In Process</header3>
<header4>Pending</header4>
</G_ROWS>
....
....
</LIST_G_ROWS>
</ORDERS>
XML::CSV
私の生活を楽にするCPANで利用できるものがあることは知っていXML::LibXML
ますが、インストールする代わりに、すでにインストールされているものを利用してXMLを作成したいと思いますXML::CSV
。上記のようにCSVを読み取ってXMLファイルを問題なく作成できましたが、XML内の要素のランダムな順序(以下のようなもの)を取得しています。上記のように、要素(子ノード)の順序を.csv
ファイルと同期させる必要がありますが、それをどのように回避するかはよくわかりません。私はaを使用してhash
いsort()
ますが、ハッシュを使用しても問題は完全には解決しませんでした。
<ORDERS>
<LIST_G_ROWS>
<G_ROWS>
<header3>Active</header3>
<header1>12</header1>
<header4>Processed</header4>
<header2>12-JUL-2012</header2>
</G_ROWS>
......
等々。以下は私のperlコードからの抜粋です
use XML::LibXML;
use strict;
my $outcsv="/path/to/data.csv";
my $$xmlFile="/path/to/data.xml";
my $headers = 0;
my $doc = XML::LibXML::Document->new('1.0', 'UTF-8');
my $root = $doc->createElement("ORDERS");
my $list = $doc->createElement("LIST_G_ROWS");
$root->appendChild($list);
open(IN,"$outcsv") || die "can not open $outcsv: $!\n";
while(<IN>){
chomp($_);
if ($headers == 0)
{
$_ =~ s/^\"//g; #remove starting (")
$_ =~ s/\"$//g; #remove trailing (")
@keys = split(/\",\"/,$_); #split per ","
s{^\s+|\s+$}{}g foreach @keys; #remove leading and trailing spaces from each field
$headers = 1;
}
else{
$_ =~ s/^\"//g; #remove starting (")
$_ =~ s/\"$//g; #remove trailing (")
@vals = split(/\",\"/,$_); #split per ","
s{^\s+|\s+$}{}g foreach @vals; #remove leading and trailing spaces from each field
my %tags = map {$keys[$_] => $vals[$_]} (0..@keys-1);
my $row = $doc->createElement("G_ROWS");
$list->appendChild($row);
for my $name (keys %tags) {
my $tag = $doc->createElement($name);
my $value = $tags{$name};
$tag->appendTextNode($value);
$row->appendChild($tag);
}
}
}
close(IN);
$doc->setDocumentElement($root);
open(OUT,">$xmlFile") || die "can not open $xmlFile: $!\n";
print OUT $doc->toString();
close(OUT);