0

我们正在做一个从 Informix 迁移到 Oracle 的数据迁移项目。现在需要比较 Informix 和 oracle 表之间的数据。因此 Informix 中的 Table1 将迁移到 Oracle 中的 Table1。
现在数据从Table1Informix 迁移到Table1Oracle。我将两个表中的数据放入 2 个平面文件中。我想看看 2 个文件中是否有任何数据差异。

File1有 300 列的File2100 万条记录和 300 列的 100 万条记录。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|228​​802|更糟
1235|Chandan|4567|chandan.kumar@worse.com|228​​862|更糟
1236|Kacitha|4567|kacitha.mishra@worse.com|228​​872|更糟
1238|沙金|4567|shajin.mahesh@worse.com|228​​873|更坏

我的第二个文件如下所示:

col1|col2|col3|col4|col5|col6
1234|ramyakrishna|4567|ramya.krishna@good.com|228​​802|好
1235|Chandan|4567|chandan.kumar@worse.com|228​​789|更糟
1236|Kacitha|4567|kacitha.mishra@worse.com|228​​872|更糟

所以当我比较两个文件时。col4我们看到和col6中存在差异row2。所以我想要这样的东西:

1234|ramyakrishna|4567|ramya.krishna@good.com|228​​802|好
:COL4-EXPECTED-ramya.krishna@worse.com:COL6-EXPECTED-worse

因此,应该打印第二个文件的上一行。然后应打印预期值。

我知道在使用任何脚本之前需要对文件进行排序。


对于 fge 的脚本,我得到如下输出:

我得到如下输出

$perl diff.perl    

第 1 行:第 38 列的不同值(为 g,预期为 w)
第 1 行:第 40 列的不同值(为 o,预期为 r)
第 1 行:第 41 列的不同值(为 d,预期为 s)
第 1 行:第 42 列的不同值(原为 .,预期为 e)
第 1 行:第 43 列的不同值(为 c,预期为 。)
第 1 行:第 44 列的不同值(为 o,预期为 c)
第 1 行:第 45 列的不同值(为 m,预期为 o)
第 1 行:第 46 列的不同值(原为 |,预期为 m)

我想要整列比较。文件是|分隔文件。

4

3 回答 3

2

假设文件按相同顺序排序,请查看commdiff。请注意,这在线路级别上运行。要深入了解字段级别的差异,您可以从行级别不同的子集开始。

于 2012-01-04T20:14:21.877 回答
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);
    }
}
于 2012-01-04T21:53:40.567 回答
0

我推荐WinMerge比较两个大文件,因为它速度很快。不幸的是,它仅在 Windows 中可用(很快将在 linux 中可用)。

由于您的平面文件来自数据库,因此您可以在转储表时轻松对其进行排序。然后使用 winmerge 比较文件。

希望这可以帮助。

于 2012-01-04T23:44:49.977 回答