对不起,我发布了这个,但很多要求已经改变,我需要建议 我的第一个输入文件是
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)第一个文件代表旧值和新值。首先是根表,第二个是实际的表,其中有diff。第三列告诉键值。第四和第五代表新旧价值。
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::Simple
或XML::Writer
可以满足要求。
这是我第一次使用xml而不确定哪种方法可以有效地帮助我解决问题 我的req的一个小例子将不胜感激。
*输入文件将始终按Root排序,然后按TBLNAME
排序输出格式
输出包含每个根,每个表中的每个表以及每个表的密钥,密钥存在于一个密钥中,然后密钥仅存在于第二个密钥中。这分别在new1和new2部分。第三部分包含Modified,需要从第一个输入文件读取并列出键值,并使用该键值列出哪些列被修改(它们的旧值和新值)
如果我必须使用XML :: Simple,我如何从这些文件创建hashref,我可以将它传递给XMLout。任何这些文件都没有密钥。
答案 0 :(得分: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>