您好,我有一个非常大的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',...是主键。解析这个文件的最好方法是什么,它不需要花费一整天的时间来运行?而且,这只需要做一次..所以一个丢弃的脚本就可以了..
发布于 2010-03-10 02:05:54
假设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;
}
}
}这是未经测试的。
发布于 2010-03-10 16:10:43
这是一个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
endhttps://stackoverflow.com/questions/2411200
复制相似问题