Найти повторяющуюся запись в большом скрипте SQL - PullRequest
1 голос
/ 09 марта 2010

Здравствуйте. У меня очень большой 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 ]

1 голос
/ 10 марта 2010

Вот версия для 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
0 голосов
/ 09 марта 2010

Предполагая, что 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;
        }
    }
}

Это не проверено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...