2

私の入力ファイルは

TBLA      COLA      A    B    
TBLA      COLB      D    E    
TBLB      COLX      M    N     
TBLB      COLD      A    B   
TBLC      COLD      A    B 

次のように xml 形式で作成される出力

<Data>    
    <TBLA>    
        <COLA>
            <oldvalue>A</oldvalue>
            <newvalue>B</newvalue>    
        </COLA>         
        <COLB>    
            <oldvalue>D</oldvalue>    
            <newvalue>E</newvalue>     
        </COLB>       
    </TBLA>    
    <TBLB>     
        <COLX>    
            <oldvalue>M</oldvalue>    
            <newvalue>N</newvalue>    
        </COLX>       
        <COLD>    
            <oldvalue>A</oldvalue>   
            <newvalue>B</newvalue>     
        </COLD>       
    </TBLB>     
    <TBLC>    
        <COLD>    
            <oldvalue>A</oldvalue>    
            <newvalue>B</newvalue>     
        </COLD>   
    </TBLC>  
</Data>     

誰でもこれを行うための最良の方法を提案できますか? このテキスト ファイルを最初にハッシュのハッシュに変換してから、pltoxml(). これは理にかなっていますか。これで十分XML::SimpleですXML::Writer

これは私がxmlに取り組んだのは初めてで、どのアプローチが私のソリューションに効率的に役立つかわかりません.
私の要求に対する小さな例をいただければ幸いです。

*入力ファイルは常に最初のフィールドでソートされます

4

2 に答える 2

2

非常に単純なデータ構造を考えると、XML ライター全体を使用する必要がないように思えます。ただし、テーブルと列の名前は有効な XML タグ名であると仮定します。

これは、データを中間データ構造に格納せずに読み取る簡単なスクリプトです。perl5 v10 以降で動作します。

use strict; use warnings; use feature 'say';

my $last_table;
say '<Data>';
while(<>) {
  chomp;
  my ($table, $col, $old, $new) = split /\t/;
  s/&/&amp;/g, s/</&lt;/g for $old, $new;
  # I'll assume $table and $col have sane names
  if (not defined $last_table) {
    say "  <$table>";
  } elsif ($last_table ne $table) {
    say "  </$last_table>";
    say "  <$table>";
  }
  $last_table = $table;
  say "    <$col>";
  say "      <oldvalue>$old</oldvalue>";
  say "      <newvalue>$new</newvalue>";
  say "    </$col>";
}
say "  </$last_table> if defined $last_table;
say '</Data>';
于 2013-04-13T09:25:11.243 に答える