我们正在进行从Informix迁移到Oracle的数据迁移项目。现在需要比较Informix和oracle表之间的数据。因此,Informix中的Table1将迁移到Oracle中的Table1
现在,数据已从Informix中的Table1
迁移到Oracle中的Table1
。我将这两个表中的数据分成2个平面文件。我想看看2个文件中是否存在任何数据差异。
File1
已经说出100万条记录,300列,File2
表示100万条记录,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|ramya.krishna@worse.com|228802|worse 1235|Chandan|4567|chandan.kumar@worse.com|228862|worse 1236|Kacitha|4567|kacitha.mishra@worse.com|228872|worse 1238|Shajin|4567|shajin.mahesh@worse.com|228873|worse
我的第二个文件如下:
col1|col2|col3|col4|col5|col6 1234|ramyakrishna|4567|ramya.krishna@good.com|228802|good 1235|Chandan|4567|chandan.kumar@worse.com|228789|worse 1236|Kacitha|4567|kacitha.mishra@worse.com|228872|worse
所以当我比较两个文件时。我们发现col4
中的col6
和row2
存在差异。所以我想要这样的东西:
1234|ramyakrishna|4567|ramya.krishna@good.com|228802|good :COL4-EXPECTED-ramya.krishna@worse.com: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)
我想要整列比较。文件是|
分隔文件。
答案 0 :(得分:2)
假设文件按相同顺序排序,请查看comm
或diff
。请注意,这可以在线路级别上运行。要深入了解字段级别的差异,您可以从不同行级别的子集总数开始。
答案 1 :(得分: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);
}
}
答案 2 :(得分:0)
我建议WinMerge比较两个大文件,因为它很快。不幸的是,它仅在Windows中可用(很快就会在linux中提供)。
由于您的平面文件来自数据库,因此您可以在转储表时轻松对其进行排序。然后使用winmerge比较文件。
希望这有帮助。