2013-04-16 3 views
0

Извините, я публикую это снова, но множество требований было изменено, и мне нужен совет.
Мой первый входной файлСоздание XML-файла в Perl - Обновленные требования

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 и не знаю, какой подход поможет в эффективном решении.
Небольшой пример по моему запросу будет оценен по достоинству.

* Входной файл всегда будет отсортирован по корневым, а затем TBLNAME

Выходной формат
Output содержит для каждого корня, каждая таблица в этом корень и что для каждой таблицы, ключ, который существует в одном, а затем ключ, существует только во втором. Это относится к разделам new1 и new2 соответственно. Третий раздел содержит Модифицированный, который должен читать из первого входного файла и отображать значение ключа и с этим значением ключа, какие столбцы изменены (их старое и новое значение)

Если мне нужно использовать XML :: Simple, как это сделать создайте hashref из этих файлов, которые я могу передать в XMLout. В любом из этих файлов нет ключа.

+0

Привет, На самом деле мой первоначальный вопрос простой, поэтому я получил некоторые советы по этому поводу. Однако я обновил вопрос с последними комментариями, но не уверен, будет ли он снова проверяться, поскольку люди уже внесли свой вклад в это. Поэтому я снова разместил то же самое с новым вопросом. Я не уверен, обновляю ли я вопрос, на который был дан ответ, снова проверяется экспертами. – user2223335

+0

Вы не должны изменять старые вопросы. Создание нового было правильным. Изменение старого не было. Я вернул старый вопрос до вашего редактирования. – simbabque

ответ

1

Это просто вопрос использования split, чтобы разделить данные на поля, сохранив их в хэш, а затем преобразовать их с помощью XML::Simple.

  • Обратите внимание, что я вставляю вещи в массив, чтобы обеспечить выполнение заказа.
  • Все данные считываются с ручки DATA. Вам не нужно, чтобы я показывал вам код ввода-вывода.
  • @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> 
+0

Hi Axeman, Спасибо за вашу помощь. Требуется определенное разъяснение. Вы можете помочь. В разделе Модифицированное значение ключа не отображается, поэтому он не указывает эти столбцы (старые и новые значения) с какими ключами. Кроме того, цикл перезаписывает старое значение, поскольку мы не использовали ключ, я попробовал этот '$ roots {$ root} {$ table} [2] {MODIFIED} {$ key} {$ col}' вместо '$ roots {$ root} {$ table} [2] {MODIFIED} {$ col} '. Но дисплей '' не подходит. Он приходит как '' (отображается только значение) – user2223335