在大型SQL脚本中查找重复条目

时间:2010-03-09 17:45:12

标签: ruby parsing

您好我有一个非常大的SQL脚本,在尝试执行它时,我从PostgreSQL收到有关重复主键的错误。它没有给出重复条目发生位置的任何内容的行号(它也包含在一个事务中,因此在文件末尾commit;之前它不知道重复。

基本上,有人可以帮我写一个快速的Ruby脚本来解析这个文件并找到重复的条目吗?在大多数编辑器中加载这个文件需要花费一分钟的时间,并且需要花费5到10分钟来进行查找 - 替换它...所以它非常庞大,我想用Ruby做的唯一方法太复杂了。它需要两个for循环,并且必须在每个循环中解析一次文件...

这些行是这种格式..

INSERT INTO ZIPCODE (ZIPCODE, CITY, STATE, STATECODE, COUNTY, COUNTYCODE) VALUES (N'00782', N'COMERIO', N'PR', N'72', N'COMERIO', N'045');

第一个(N'xxxxx',...是主键..解析此文件的最佳方法是什么,不需要整天运行?此外,这只需要做一次..所以扔掉脚本很好..

2 个答案:

答案 0 :(得分:1)

这是一个Ruby版本:

#!/usr/bin/env ruby

seen = {}
line_num = 0
$stdin.each_line do |line|
  line_num += 1
  next unless line.start_with?('INSERT INTO ZIPCODE')
  zip = line.scan(/\d{5}/).first
  if seen[zip]
    puts "Line #{line_num} is a duplicate of line #{seen[zip]}"
  else
    seen[zip] = line_num
  end
end

答案 1 :(得分:0)

假设Perl是可以接受的:

#!/usr/bin/perl

use strict;

my %zips;
my $lineNum = 0;
while (<STDIN>)
{
    chomp;
    $lineNum++;
    if(/INSERT INTO ZIPCODE \(ZIPCODE, CITY, STATE, STATECODE, COUNTY, COUNTYCODE\) VALUES \(N'(\d{5})'/)
    {
        if($zips{$1})
        {
            print "Found duplicate zipcode at $lineNum (first instance $zips{$1}): $1";
        }
        else
        {
            $zips{$1} = $lineNum;
        }
    }
}

这是未经测试的。