首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在大型SQL脚本中查找重复条目

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

Stack Overflow用户
提问于 2010-03-10 01:45:12
回答 2查看 153关注 0票数 1

您好,我有一个非常大的SQL脚本,当我试图执行它时,我从PostgreSQL得到一个关于重复主键的错误。它没有给出重复项出现的位置的行号(它也包装在事务中,所以直到文件末尾的commit;才知道重复项)。

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

这些行的格式为..

代码语言:javascript
复制
INSERT INTO ZIPCODE (ZIPCODE, CITY, STATE, STATECODE, COUNTY, COUNTYCODE) VALUES (N'00782', N'COMERIO', N'PR', N'72', N'COMERIO', N'045');

第一个(N'xxxxx',...是主键。解析这个文件的最好方法是什么,它不需要花费一整天的时间来运行?而且,这只需要做一次..所以一个丢弃的脚本就可以了..

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-10 02:05:54

假设Perl是可接受的:

代码语言:javascript
复制
#!/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;
        }
    }
}

这是未经测试的。

票数 0
EN

Stack Overflow用户

发布于 2010-03-10 16:10:43

这是一个Ruby版本:

代码语言:javascript
复制
#!/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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2411200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档