您好我有一个非常大的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',...
是主键..解析此文件的最佳方法是什么,不需要整天运行?此外,这只需要做一次..所以扔掉脚本很好..
答案 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;
}
}
}
这是未经测试的。