0

抱歉,我再次发布此内容,但很多要求已更改,我需要建议。
我的第一个输入文件是

Root1      TBLA      KEY1      COLA      A    B    
Root1      TBLA      KEY1      COLB      D    E    
Root1      TBLA      KEY3      COLX      M    N     
Root2      TBLB      KEY4      COLX      M    N     
Root2      TBLB      KEY4      COLD      A    B   
Root3      TBLC      KEY5      COLD      A    B 

我的第二个输入文件是

Root1      TBLA      KEY6    
Root2      TBLB      KEY7    
Root3      TBLC      KEY8 

我的第三个输入文件是

Root1      TBLA      KEY9    
Root1      TBLA      KEY10    
Root3      TBLC      KEY11 

基本上文件表示是
1) 第一个文件表示旧值和新值。首先是根表,其次是存在差异的实际表。第三列告诉键值。第四和第五代表新旧价值。

2)第二个文件代表只存在于db1中而不存在于db2中的主键。首先是根表,其次是存在键的实际表。第三列告诉键值

3) 第三个文件代表主键,它只存在于 db2 中,不存在于 db1 中。首先是根表,其次是存在键的实际表。第三列告诉键值

以 xml 格式创建的输出为

   <Data>    
    <Root1>
        <TBLA>    
            <NEW1>
                <KEY>KEY6</KEY>
            <NEW1>              
            <NEW2>
                <KEY>KEY9</KEY>
                <KEY>KEY10</KEY>
            <NEW2>              
            <MODIFIED>
                <KEY name =KEY1>
                    <COLA>
                        <oldvalue>A</oldvalue>
                        <newvalue>B</newvalue>    
                    </COLA> 
                    <COLB>    
                        <oldvalue>D</oldvalue>    
                        <newvalue>E</newvalue>     
                    </COLB>
                </KEY>
                <KEY name =KEY3>
                    <COLX>
                        <oldvalue>M</oldvalue>
                        <newvalue>N</newvalue>    
                    </COLX> 
                </KEY>
            </MODIFIED>     
        </TBLA>
    </Root1>        
    <Data>

这不是完整的输出。显示部分输出 任何人都可以建议最好的方法是什么。我应该先将此文本文件转换为哈希值,然后再尝试使用pltoxml(). 这有意义吗?可以XML::SimpleXML::Writer足够了。

这是我第一次使用 xml 并且不确定哪种方法可以有效地帮助我的解决方案。
我的请求的一个小例子将不胜感激。

*输入文件将始终按 Root 排序,然后按 TBLNAME

输出格式
输出包含每个根、该根中的每个表以及每个表的输出,其中一个存在于一个中的键,然后仅存在于第二个中的键。这分别出现在 new1 和 new2 部分。第三部分包含 Modified 需要从第一个输入文件中读取并列出键值以及使用该键值修改哪些列(它们的旧值和新值)

如果我必须使用 XML::Simple,我如何从这些文件创建 hashref,我可以将其传递给 XMLout。这些文件中没有任何密钥。

4

1 回答 1

1

这只是一个简单的问题,split将数据拆分为字段,将其存储到哈希中,然后使用XML::Simple.

  • 请注意,我将事物放入数组中以强制执行您想要的顺序。
  • DATA从句柄中读取所有数据。你不应该需要我给你看 IO 代码。
  • @processors数组只是您将在各种文件上使用的不同处理器:

代码:

use 5.016;
use strict;
use warnings;

use XML::Simple qw(:strict);

my %roots;

my @processors 
    = ( sub {
           my ( $root, $table, $key, $col, $old, $new ) = split /\s+/;
           $roots{ $root }{ $table }[2]{MODIFIED}{ $col }
                = { oldvalue => $old 
                  , newvalue => $new 
                  };
           return;
        }
      , sub { 
          my ( $root, $table, $key ) = split /\s+/;
          push @{ $roots{ $root }{ $table }[0]{NEW1}{KEY} }, $key;
        }
      , sub { 
          my ( $root, $table, $key ) = split /\s+/;
          push @{ $roots{ $root }{ $table }[1]{NEW2}{KEY} }, $key;
        }
      );

my $processor = shift @processors;
while ( <> ) { 
    chomp;
    if ( $_ eq '---' ) { 
        $processor = shift @processors;
    }
    else {
        $processor->( $_ );
    }
}

my $xs = XML::Simple->new( NoAttr => 1, RootName => 'Data', );
my $xml = $xs->XMLout( \%roots, KeyAttr => {} );
say $xml;

它产生:

<Data>
  <Root1>
    <TBLA>
      <NEW1>
        <KEY>KEY6</KEY>
      </NEW1>
    </TBLA>
    <TBLA>
      <NEW2>
        <KEY>KEY9</KEY>
        <KEY>KEY10</KEY>
      </NEW2>
    </TBLA>
    <TBLA>
      <MODIFIED>
        <COLA>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLA>
        <COLB>
          <newvalue>E</newvalue>
          <oldvalue>D</oldvalue>
        </COLB>
        <COLX>
          <newvalue>N</newvalue>
          <oldvalue>M</oldvalue>
        </COLX>
      </MODIFIED>
    </TBLA>
  </Root1>
  <Root2>
    <TBLB>
      <NEW1>
        <KEY>KEY7</KEY>
      </NEW1>
    </TBLB>
    <TBLB></TBLB>
    <TBLB>
      <MODIFIED>
        <COLD>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLD>
        <COLX>
          <newvalue>N</newvalue>
          <oldvalue>M</oldvalue>
        </COLX>
      </MODIFIED>
    </TBLB>
  </Root2>
  <Root3>
    <TBLC>
      <NEW1>
        <KEY>KEY8</KEY>
      </NEW1>
    </TBLC>
    <TBLC>
      <NEW2>
        <KEY>KEY11</KEY>
      </NEW2>
    </TBLC>
    <TBLC>
      <MODIFIED>
        <COLD>
          <newvalue>B</newvalue>
          <oldvalue>A</oldvalue>
        </COLD>
      </MODIFIED>
    </TBLC>
  </Root3>
</Data>
于 2013-04-16T13:49:43.443 回答