Forum Webscript.Ru
Программирование => Perl => Тема начата: AnnA от 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
понимаю - код не очень маленький, но - возможно - сразу кто-то увидит в чем здесь проблема.
спасибо.
-
- кодовая страница верна?
- кодовая страница db тоже верна?
- глупый вопрос, но поля не обозначены как binary? (в этом случае регистр учитывается)
- встретив в ячейке кавычки excel немного видоизменит эту ячейку в конечном текстовом файле. наиболее простой способ учесть эту особенность, это воспользоваться модулем DBD::CSV (суб-модуль к DBI)
- использование binmode не будет лишним
- возможно стоит учесть возможные пробелы в ячейках? например, если поудалять по краями и ужать до 1-го остальные, то вероятность совпадения имён увеличится
не относящиеся к делу моменты:
- imho: слишком много телодвижений для работы с файлами
- ты проверяешь корректность, составленного тобой запроса при $dbh->prepare, но при этом совершенно не заботишься(imho) о его выполнении. наиболее простой способ учесть это - использовать доп. параметры RaiseError, HandleError и PrintError при инициализации подключения, и больше об этом не беспокоиться
-
- кодовая страница верна?
- кодовая страница db тоже верна?
Да. ;) Происходит следующее: В базе, допустим, есть Иванов, Сидоров, Петров есть они и в файле.
Скрипт находит cовпадения только на Иванова и Сидорова. Тогда как Петров есть и в базе и в файле.
В файле 49 фамилий из которых скрипт находит совпадений 43, 2 фамилий действительно нет в базе, а вот остальные есть и в базе, и в файле, но скрипт почему-то их не считает одинаковыми.
- встретив в ячейке кавычки excel немного видоизменит эту ячейку в конечном текстовом файле. наиболее простой способ учесть эту особенность, это воспользоваться модулем DBD::CSV (суб-модуль к DBI)
о! вот этого я не знала. спасибо. почитаю про DBD::CSV. кавычки действительно бьются. в файле есть и такие « и такие "
- использование binmode не будет лишним
м? Вы так думаете? для текстового файла? попробую. :)
- возможно стоит учесть возможные пробелы в ячейках? например, если поудалять по краями и ужать до 1-го остальные, то вероятность совпадения имён увеличится
вот! :) мне кажется, что первое, что мне необходимо сделать - избавиться от пробелов! И, вроде вещь очевидная, но чтот не додумалась сама. ;)
не относящиеся к делу моменты:
за них отдельное спасибо. люблю учиться.
- imho: слишком много телодвижений для работы с файлами
Возможно, но в данном случае телодвижения оправданы. Я привела лишь часть кода всего скрипта.
- ты проверяешь корректность, составленного тобой запроса при $dbh->prepare, но при этом совершенно не заботишься(imho) о его выполнении. наиболее простой способ учесть это - использовать доп. параметры RaiseError, HandleError и PrintError при инициализации подключения, и больше об этом не беспокоиться
у меня включены RaiseError и PrintError. :)
-
все-таки пробелы действительно. убираю их и все работает.
спасибо еще раз.