2012-01-04 1 views
0

Мы делаем проект миграции данных, переносящийся с Informix на Oracle. Теперь возникло требование сравнить данные между таблицами Informix и oracle. Таким образом, таблица1 из Informix будет перенесена в таблицу 1 в Oracle.
Теперь данные переносятся с Table1 в Informix на Table1 в Oracle. Я беру данные из обеих таблиц в 2 плоских файла. Я хочу просто посмотреть, есть ли разница в данных в 2 файлах.Я хотел бы иметь разницу между 2 файлами. Хотите найти конкретно, в каком столбце разница произошла с использованием Unix Scripting

File1 сказал, что 1 миллион записей с 300 столбцами и File2 говорят 1 миллион записей с 300 столбцами. File1 и File2 - файлы с разделителями каналов. Таким образом, разница может быть в любом месте файла. Почти целая строка может совпадать, но разница может быть в одном/двух столбцах. Поэтому я хотел бы узнать различия, соблюдая все перечисленные выше. Разностный вывод должен содержать список row1 in file1 is not matching with row1 in file2 at column 3 и значение столбцов из обоих файлов. Все такие отличия от обоих файлов должны быть перечислены на консоли с понятным форматом непрофессионала.

Я хочу просто объяснить это примером, чтобы сделать его более понятным.

Мой первый файл, если он выглядит, как показано ниже:

 
col1|col2|col3|col4|col5|col6 
1234|ramyakrishna|4567|[email protected]|228802|worse 
1235|Chandan|4567|[email protected]|228862|worse 
1236|Kacitha|4567|[email protected]|228872|worse 
1238|Shajin|4567|[email protected]|228873|worse 

Мой второй файл выглядит следующим образом:

 
col1|col2|col3|col4|col5|col6 
1234|ramyakrishna|4567|[email protected]|228802|good 
1235|Chandan|4567|[email protected]|228789|worse 
1236|Kacitha|4567|[email protected]|228872|worse 

Так что, когда я сравнить оба файла. Мы видим, что существует разница в col4 и col6 в row2. Поэтому я хочу что-то вроде этого:

 
1234|ramyakrishna|4567|[email protected]|228802|good 
:[email protected]:COL6-EXPECTED-worse 

Значит, в следующей строке из второго файла следует напечатать. Затем ожидаемые значения должны быть напечатаны.

Я знаю, что файлы необходимо сортировать перед использованием любого скрипта.


Для сценария FGE в я получаю, как показано ниже вывод:

Я получаю, как показано ниже вывод

 
$perl diff.perl  

Line 1: different value for column 38 (was g, expected w) 
Line 1: different value for column 40 (was o, expected r) 
Line 1: different value for column 41 (was d, expected s) 
Line 1: different value for column 42 (was ., expected e) 
Line 1: different value for column 43 (was c, expected .) 
Line 1: different value for column 44 (was o, expected c) 
Line 1: different value for column 45 (was m, expected o) 
Line 1: different value for column 46 (was |, expected m) 

Я хочу, чтобы все сравнение столбца. Файлы | файлы с разделителями.

ответ

2

Предполагая, что файлы отсортированы в том же порядке, посмотрите на comm или diff. Имейте в виду, что это работает на линейном уровне. Чтобы перейти к различиям на полевом уровне, вы можете начать с населения подмножества тех, кто отличается от линейного уровня.

+0

Да, я пробовал использовать коммит, но в итоге я просто перечислял строки, которые имеют отличия. Но не смог перечислить, где ровно 2 строки отличаются. Спасибо за ответ. – Chkusi

+0

Я пробовал использовать команду comm. Здесь, как я могу получить записи, уникальные только для file1 и уникальные для file2. Меня не интересуют записи, общие для обоих файлов. Поэтому, когда у нас есть записи, уникальные друг для друга, то, возможно, мы сможем найти какую-то работу, чтобы проверить точную разницу. – Chkusi

2

Нечто подобное (в Perl) может сделать - это предполагает, что файлы имеют одинаковое количество строк, но это можно легко проверить с wc, и что ни одна строка не пуста:

#!/usr/bin/perl -W 
use strict; 

open FILE1, "file1" or die; 
open FILE2, "file2" or die; 

my (@cols1, @cols2); 
my ($val1, $val2); 
my $linenr = 0; 

while (my $line = <FILE1>) { 
    @cols1 = split('|', $line); 
    @cols2 = split('|', <FILE2>); 
    $linenr++; 

    for (my $i = 0; $i <= $#cols1; $i++) { 
     $val1 = $cols1[$i]; $val2 = $cols2[$i]; 
     if ("$val1" ne "$val2") { 
      printf("Line %d: different value for column %d (was %s, expected %s)\n", 
       $linenr, $i+1, $val2, $val1); 
    } 
} 
+0

Почему вы используете '#!/Usr/bin/perl -W', а не просто' use warnings ;'? –

+0

@BradGilbert Просто привычка ... – fge

+0

'if (" $ val1 "! =" $ Val2 ") {...}', вероятно, неверно. Вместо этого используйте 'if ($ val1 ne $ val2) {...}'. (Или 'if ($ val1! = $ Val2) {...}', если вы действительно хотите сравнить численно.) –

0

Я рекомендую WinMerge сравнить два больших файла, потому что это быстро. К сожалению, он доступен только в Windows (скоро будет доступен в Linux).

Поскольку ваши плоские файлы поступают из базы данных, вы можете легко отсортировать их, когда вы выгружаете таблицы. Затем используйте winmerge для сравнения файлов.

Надеюсь, это поможет.

+0

К сожалению, наша система работает на машине Solaris, и мы должны использовать некоторые Unix-работы для этого. – Chkusi