Автор Тема: сравнение выборки из бд  (Прочитано 3787 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сравнение выборки из бд
« : 13 Февраля 2006, 19:30:32 »
Привет.  ;) Не дайте голову сломать, а?
в таблице хранятся данные вида: ФАМИЛИЯ Имя
таблица небольшая, около 500 записей. Есть текстовый файл (изначально - файл Экселя) разделители - табулятор.
хочется читать файл, сравнивать фамилию из базы с той, которая есть в файле, если совпали фамилия и имя - добавить в базу некоторые записи. Проблема в том, что код находит не все фамилии. То есть в базе точно есть такая фамилия, а результат работы кода говорит, что нет. При этом если ручками сделать селект из базы с такой фамилией - показывает, что есть. Но скрипт не находит. ума неприложу в чем может быть проблема. даже не могу найти закономерности по которой он их пропускает. одни находит, другие - нет. интересно было бы узнать почему собственно. Уже по-всякому пробовала - результат тот же. Есть определенный список фамилий, которые он не хочет находить:my ($j,$k)=(1,1);
my($lastname,$name,$middlename,$born,$prof,$work_plase,$job,$awards,$postal,$h_ph,$w_ph,$m_ph,$email,$content);
my $exist = qq~select id,lastname,firstname from experts where lastname like ? and firstname like ?~;

my $expExist = $dbh->prepare($exist) or die $DBI::errstr;

open(D,"<",$pt)            or die "Can\'t read $pt: $!";
unless (flock(D, LOCK_SH | LOCK_NB)) {
      local $|=1;
      print "$pt temporarily unavailable - wait for unlock";
      flock(D, LOCK_SH) or die "Can\'t lock $pt: $!";
      print "Got it!\\n
";
      }
seek(D,0,0);
while() {
($lastname,$name,$middlename,$born,$prof,$work_plase,$job,$awards,$postal,$h_ph,$w_ph,$m_ph,$email,$content)=split("\\t");

if($lastname) {
    $lastname = uc($lastname); chomp($content);
        $expExist->bind_param(1,$lastname);
        $expExist->bind_param(2,$name);
        my @row = $dbh->selectrow_array($expExist);
if($row[0]) {
         $middlename=$dbh->quote($middlename);
...
print qq~$j. $row[0] - $row[1] $row[2] from file: /$lastname $name/~; $j++;
 } else  {print qq~$k. $lastname $name~; $k++;}
    } else {next}
}
#$dbh->commit();
#$dbh->disconnect();
flock(D,LOCK_UN);close(D);
exit

понимаю - код не очень маленький, но - возможно - сразу кто-то увидит в чем здесь проблема.

спасибо.
пока-пока. :)

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
сравнение выборки из бд
« Ответ #1 : 13 Февраля 2006, 20:39:20 »
- кодовая страница верна?
- кодовая страница db тоже верна?
- глупый вопрос, но поля не обозначены как binary? (в этом случае регистр учитывается)
- встретив в ячейке кавычки excel немного видоизменит эту ячейку в конечном текстовом файле. наиболее простой способ учесть эту особенность, это воспользоваться модулем DBD::CSV (суб-модуль к DBI)
- использование binmode не будет лишним
- возможно стоит учесть возможные пробелы в ячейках? например, если поудалять по краями и ужать до 1-го остальные, то вероятность совпадения имён увеличится

не относящиеся к делу моменты:
- imho: слишком много телодвижений для работы с файлами
- ты проверяешь корректность, составленного тобой запроса при $dbh->prepare, но при этом совершенно не заботишься(imho) о его выполнении. наиболее простой способ учесть это - использовать доп. параметры RaiseError, HandleError и PrintError при инициализации подключения, и больше об этом не беспокоиться
« Последнее редактирование: 13 Февраля 2006, 20:47:26 от ondr »
0 OK, 0:1

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сравнение выборки из бд
« Ответ #2 : 14 Февраля 2006, 12:14:34 »
Цитировать
- кодовая страница верна?
- кодовая страница db тоже верна?

Да. ;) Происходит следующее: В базе, допустим, есть Иванов, Сидоров, Петров есть они и в файле.
Скрипт находит cовпадения только на Иванова и Сидорова. Тогда как Петров есть и в базе и в файле.
В файле 49 фамилий из которых скрипт находит совпадений 43, 2 фамилий действительно нет в базе, а вот остальные есть и в базе, и в файле, но скрипт почему-то их не считает одинаковыми.

Цитировать
- встретив в ячейке кавычки excel немного видоизменит эту ячейку в конечном текстовом файле. наиболее простой способ учесть эту особенность, это воспользоваться модулем DBD::CSV (суб-модуль к DBI)

о! вот этого я не знала. спасибо. почитаю про DBD::CSV. кавычки действительно бьются. в файле есть и такие « и такие "

Цитировать
- использование binmode не будет лишним

м? Вы так думаете? для текстового файла? попробую. :)

Цитировать
- возможно стоит учесть возможные пробелы в ячейках? например, если поудалять по краями и ужать до 1-го остальные, то вероятность совпадения имён увеличится

вот! :) мне кажется, что первое, что мне необходимо сделать - избавиться от пробелов! И, вроде вещь очевидная, но чтот не додумалась сама. ;)

Цитировать
не относящиеся к делу моменты:

за них отдельное спасибо. люблю учиться.
Цитировать
- imho: слишком много телодвижений для работы с файлами

Возможно, но в данном случае телодвижения оправданы. Я привела лишь часть кода всего скрипта.

Цитировать
- ты проверяешь корректность, составленного тобой запроса при $dbh->prepare, но при этом совершенно не заботишься(imho) о его выполнении. наиболее простой способ учесть это - использовать доп. параметры RaiseError, HandleError и PrintError при инициализации подключения, и больше об этом не беспокоиться

у меня включены RaiseError и PrintError. :)
« Последнее редактирование: 14 Февраля 2006, 12:20:17 от AnnA »
пока-пока. :)

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
сравнение выборки из бд
« Ответ #3 : 15 Февраля 2006, 19:16:55 »
все-таки пробелы действительно. убираю их и все работает.
спасибо еще раз.
пока-пока. :)

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28