免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4303 | 回复: 16
打印 上一主题 下一主题

如何比较啊? [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-23 09:47 |只看该作者 |倒序浏览
看了篇帖子, 内容如下:
create table A(
x char(1) not null,
y char(2) null,
primary key(x)
)

create table B(
x char(1) not null,
y char(2) null,
z char(3) null,
primary key(x)
)

我的想法是:加入这两个建表语句分别在A.txt ,B.txt 中
然后采用正则表达式分别将这两个表序列化(如A|x char(1) ... )(B|x char(1) ....) ,然后再比较是否相同就可以了。
请教高手帮忙实现。谢谢!!

感觉按照楼主思路简单的进行字符串比较的话, 可能存在一些问题. (没有根据的瞎想)
比如:
create table A(
y char(2) null,
x char(1) not null,

primary key(x)
)

create table B(
x char(1) not null,
y char(2) null,

z char(3) null,
primary key(x)
)

字段名称, 类型/长度, 能否为空 全部一致, 只是create table 语句创建字段的顺序不同, 这种情况下, 该如何进行比较. 还请大家指点, 谢谢大家...

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
2 [报告]
发表于 2016-06-23 10:13 |只看该作者
在这里 我有个地方不懂 如何准确的抓取字段的创建语句 而不会错误的命中其他的语句.
上面的 create table 语句比较简单, 其中没有添加一些非创建字段语句 只包含了一个主键约束 primary key(x), 好了, 我的问题描述完毕, 最后谢谢大家.

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
3 [报告]
发表于 2016-06-23 10:40 来自手机 |只看该作者
依旧不清楚您想要什么结果

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-06-23 10:46 |只看该作者
回复 3# RE_HASH
不好意思, 刚才忘了说了, 不同的话 直接输出不同即可, 否则啥都不输出. (语句中多余的空白不能作为比较依据)

   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
5 [报告]
发表于 2016-06-23 10:48 来自手机 |只看该作者
把你想要的结果写出来看看

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
6 [报告]
发表于 2016-06-23 10:53 |只看该作者
回复 5# RE_HASH
我的这个可能有些问题, 比如: 不能有效的判断哪些是创建字段的语句.
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. $/ = '';
  5. my (@aData);
  6. while (<DATA>){
  7.     chomp;
  8.     s/\h+/ /g;
  9.     s/\n/|/g;
  10.     s!(?<=\(\|)(.*,)!join ("|",sort($1=~/[^|]+/g))!e;
  11.     push (@aData, $_);
  12. }

  13. print "Diff!\n" if ("$aData[0]" ne "$aData[-1]");

  14. __DATA__
  15. create table A(
  16. y char(2) null,
  17. x char(1) not null,
  18. primary key(x)
  19. )

  20. create table B(
  21. x char(1) not null,
  22. y char(2) null,
  23. z char(3) null,
  24. primary key(x)
  25. )
复制代码

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
7 [报告]
发表于 2016-06-23 11:10 |只看该作者
假设 有这样的 create table 语句就不行了.
create table A(
y char(2) null,
x char(1) not null
)

create table B(
x char(1) not null,
y char(2) null,
z char(3) null
)

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2016-06-23 11:34 |只看该作者
回复 7# sunzhiguolu

create table A(
y char(2) null,
x char(1) not null
)

create table
B(
x char(1) not null,
y char(2) null,
z char(3) null
)
   

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
9 [报告]
发表于 2016-06-23 11:51 |只看该作者
回复 8# jason680
大神, 我还是没有看明白 您能给个示例代码吗. 谢谢您...

   

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
10 [报告]
发表于 2016-06-23 14:01 |只看该作者
$ perl table_diff.pl
compare table [A] and [B]
----------------------------------------------
  [A] z : *** NOT FOUND ***
  [B] z : z char(3) null

compare table [A] and [C]
----------------------------------------------
  [A] primary key : primary key(x)
  [C] primary key : *** NOT FOUND ***

compare table [A] and [D]
----------------------------------------------
  [A] primary key : primary key(x)
  [D] primary key : *** NOT FOUND ***
----------------------------------------------
  [A] z : *** NOT FOUND ***
  [D] z : z char(3) not null

compare table [B] and [C]
----------------------------------------------
  [B] primary key : primary key(x)
  [C] primary key : *** NOT FOUND ***
----------------------------------------------
  [B] z : z char(3) null
  [C] z : *** NOT FOUND ***

compare table [B] and [D]
----------------------------------------------
  [B] primary key : primary key(x)
  [D] primary key : *** NOT FOUND ***
----------------------------------------------
  [B] z : z char(3) null
  [D] z : z char(3) not null

compare table [C] and [D]
----------------------------------------------
  [C] z : *** NOT FOUND ***
  [D] z : z char(3) not null


$ cat  table_diff.pl
use strict;
use warnings;

my ($sTable, @aTable, %hTable);
my $sGet_table = 0;
while(<DATA>){
  chomp;
  next if(m/^\s*(#|$)/);
  s/^\s+|\s+$//g;
  if(m/^create\s+table\s+(\w+)[(]/){
    $sTable = $1;
    push @aTable, $sTable;
    $sGet_table = 1;
    next;
  }
  $sGet_table = 0 if(m/^[)]/);
  next if($sGet_table == 0);
  
  s/\s+/ /g;  
  s/,$//;
  if(m/primary key[(](\w+)[)]/){
    $hTable{$sTable}{"primary key"} = $_;
    next;
  }
  if(m/^(\S+)/){
    $hTable{$sTable}{$1} = $_;
  }
}

die "less than 2 tables \n" if(@aTable <2);
foreach my $n(0 .. @aTable-2){
  foreach( $n+1 .. @aTable-1){
    compare_table(@aTable[$n, $_]);
  }
}


sub compare_table{
  my ($sT1, $sT2) = @_;
  my $sMsg = "compare table [$sT1] and [$sT2]\n";
  foreach(keys $hTable{$sT1}){
    if(! exists $hTable{$sT2}{$_}){
      $sMsg .= "----------------------------------------------\n";
      $sMsg .= "  [$sT1] $_ : $hTable{$sT1}{$_}\n";  
      $sMsg .= "  [$sT2] $_ : *** NOT FOUND ***\n";
      next;
    }
    if($hTable{$sT1}{$_} ne $hTable{$sT2}{$_}){
      $sMsg .= "----------------------------------------------\n";
      $sMsg .= "  [$sT1] $_ : $hTable{$sT1}{$_}\n";  
      $sMsg .= "  [$sT2] $_ : $hTable{$sT2}{$_}\n";  
    }
  }

  foreach(keys $hTable{$sT2}){
    if(! exists $hTable{$sT1}{$_}){
      $sMsg .= "----------------------------------------------\n";
      $sMsg .= "  [$sT1] $_ : *** NOT FOUND ***\n";
      $sMsg .= "  [$sT2] $_ : $hTable{$sT2}{$_}\n";  
    }
  }
  print "$sMsg\n";
}
__DATA__
...
create table A(
y   char(2)   null,
x char(1)  not null,

primary  key(x)
)
...
create table B(
x char(1) not null,
y char(2) null,
z   char(3) null,
primary   key(x)
)
...
create table C(
y char(2) null,
x char(1) not null
)

create table D(
x char(1) not null,
y char(2) null,
z char(3) not null
)
   

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 就是一个架构比较工具啊!!!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP