Поиск однофамильцев в типизированном файле |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
Поиск однофамильцев в типизированном файле |
alex9910 |
2.06.2012 18:15
Сообщение
#1
|
Новичок Группа: Пользователи Сообщений: 16 Пол: Мужской Репутация: 0 |
Нужно вывести из типизированного ф-ла однофамильцев. Типизированный файл состоит из типа запись.
Например: при запросе фамилии Петрова выводились все стоки с фамилиями Петрова и Петров. или при запросе : Петров выводились и Петров и Петрова. Как можно сделать проверку на подстановку или отброс окончаний? Всем заранее спасибо! procedure print_usl; |
IUnknown |
2.06.2012 18:48
Сообщение
#2
|
a.k.a. volvo877 Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: 627 |
Ну вот и сделай так:
IF str_v[length(str_v)]= 'а' then , а потом в цикле сравнивай test_fio с текущей фамилией: if (F.FIO_Stud = test_fio) or (F.FIO_Stud = test_fio + 'a') then(Можно было бы искать через if pos(F.FIO_Stud, test_fio) > 0 then, но будут ложные срабатывания: "Петров" и "Петровский" будут считаться похожими, а это не так). Но это не самая хорошая идея, сравнивать напрямую. Очень много несоответствий начнется. Скажем, фамилия "Ланская" - как сравнить ее с "Ланской"? Проверять на 'ая'? Найдется несколько других примеров, с которыми ни проверка на "а", ни проверка на "ая" не сработают. Т.е., тебе придется делать много проверок. У меня есть более интересная идея. Есть такое понятие, как "расстояние Левенштейна" - т.е., мера похожести двух строк. (Это не важно сейчас, но высчитывается эта мера как количество шагов, которые нужно проделать для преобразования одной строки в другую. Чем меньше это количество - тем строки ближе. Будет логично предположить, что для мужских/женских фамилий дистанция Левенштейна не будет больше 2, т.е., максимум за 2 шага из одной фамилии можно получить другую). Я бы все-таки подумал в эту сторону. Чем добавлять десятки проверок, и не факт, что будут учтены все сочетания, проще сделать подсчет этой дистанции, и проверять ее. Подумай над этим. Это из области Fuzzy Search, т.е., Нечеткого Поиска, а у тебя как раз поиск нечеткий, у тебя не жестко заданная строка, которую надо найти, а нужно "найти что-то, очень похожее вот на это". |
Текстовая версия | 11.06.2024 6:04 |