Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Поиск в текстовом файле

Автор: DroN_S
Дата сообщения: 29.05.2005 10:35
Как сделать поиск в текстовом файле, например, есть текстовой файл с заполнением в следующем порядке: фамилия, имя, отчество, адрес, номер телефона, адрес. Заполнение ведётся в одну строку. Надо чтобы при вводе одного из перечисленных названий, выводились результата поиска в файле. Например: ввели номер 458965, и например в RichEdit'e вывелись все фамилии которые схожи с заданным номером в данном текстовом файле. Подскажите как это сделать?
Автор: YurikGL
Дата сообщения: 29.05.2005 11:01
Советую сначала перегнат в любую базу данных.

Если же именно текст, то можно считать все в одну строку и искать pos-м... но это будет некорректно.
Можно считывать построчно и анализировать каждую строчку с помощью pos
Автор: DroN_S
Дата сообщения: 29.05.2005 12:01

Цитата:
Можно считывать построчно и анализировать каждую строчку с помощью pos

Можно пример кода...
Автор: wellwisher
Дата сообщения: 29.05.2005 23:45
DroN_S - здесь посмотри - профессинально сделано :
http://delphiworld.narod.ru/base/search_text_in_text_file.html
Вообще то файл структурирован ? т.е. фамилия - n поз. в строке, имя - n+i1 поз. в строке, и т.п.. ? Строка - обычная (<256 end cr/lf) ?
Чтото подобное у меня валялось - поищу на работе если надо.
Хотя совет-решение YurikGL (БД) - считаю более предпочтительным.

Автор: OdesitVadim
Дата сообщения: 30.05.2005 10:51
YurikGL

Цитата:
Советую сначала перегнат в любую базу данных.

Пушкой по воробъях?

DroN_S
простой вариант

Код:
reset(f);
while not eof(f) do
begin
readln(f,s);//Читаем строку с файла
if (<здесь условие, проверяющее подходит ли номер>) then RichEdit1.lines.add(s);
end;
closefile(f);
Автор: YurikGL
Дата сообщения: 30.05.2005 18:34

Цитата:
Пушкой по воробъях?


Меня смущает номер 458965
Если там подобное количество записей, то это - но воробей, хотя и не орел

Кстати, если не ошибаюсь, были какие-то драйверы в ADO, которые позволяли напрямую к текствому файлу, как к БД обращаться...
Автор: OdesitVadim
Дата сообщения: 30.05.2005 18:47
YurikGL

Цитата:
Меня смущает номер 458965

читай первый пост! там явно сказано, что этот номер = телефонный. А раз так, то всё нормально.

Цитата:
Кстати, если не ошибаюсь, были какие-то драйверы в ADO, которые позволяли напрямую к текствому файлу, как к БД обращаться...

Да такие есть. там только файл-схему описать нужно. Но тормознутые - у меня десяток записей по пару полей - с секунду выборка (мож меньше, но на глаз заметно и сильно)
Автор: wellwisher
Дата сообщения: 30.05.2005 19:57
Прошу прощения :
OdesitVadim

Цитата:
reset(f);
while not eof(f) do
begin
readln(f,s);//Читаем строку с файла
if (<здесь условие, проверяющее подходит ли номер>) then RichEdit1.lines.add(s);
end;
closefile(f);

Т.е. в цикле выполняется поиск заданной подстроки (метод brute force) :


Цитата:
function Find_Sustr(const S, P : String) : Boolean; // Поиск подстроки P в строке S
var
i, j : Integer;
begin
Result := False;
if Length(P) > Length(S) then Exit; // защита от дурака
for i := 1 to Length(S) - Length(P) + 1 do
for j := 1 to Length(P) do
if P[j] <> S[i+j-1] then Break
else if j = Length(P) then
begin
Result := True;
Exit;
end;
end;
Если Find_Sustr=True - добавляем куда то (RichEdit1.lines.add)

Но вообще то даже нерадивым студентам известен алгоритм Бойера-Мура (если текст большой и поисковая строка велика). Дело вкуса.
Автор: DroN_S
Дата сообщения: 31.05.2005 11:02

Цитата:
так как не знаю точного формата строки в файле,

Формат строки следующий:
Ф.И.О. Номер телефона Адрес проживания
Автор: OdesitVadim
Дата сообщения: 31.05.2005 13:49
wellwisher
Я же не написал как реализовать условия (в явном виде). Как вариант, предложил поиск. Даже если применять алгоритм Бойера-Мура, строку всёравно нужно пропарсить, так как нужно найти нужное поле (иначе например, например индекс в адресе может совпадать с номером телефона - будет ложная выборка.) номер телефона не может быть очень длиным (по медждународным нормам - 12 цифр и плюсик, кажеться).
DroN_S
ты не совсем ответил на вопрос. Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?
Автор: DroN_S
Дата сообщения: 31.05.2005 14:43

Цитата:
Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?

Нет никакой привязки к полям и пробелы никакой роли не играют....
Автор: OdesitVadim
Дата сообщения: 31.05.2005 14:59
DroN_S
Обычно записи разделяются к примеру одним(хотя бы)пробелом. Если в Фио может быть 3 или 4 или неизвестно сколько пробелов, то задача попахивает искуственным интелектом - так как прийдётся думать как выделять.
Мож приведёш кусок файла? Хотябы 3-4 строки. И это преподы задали?
Автор: Sleepwalker
Дата сообщения: 31.05.2005 16:09
wellwisher
откуда взял алгоритм?
все проще:

Код:
var
k,k1: integer;
i:integer;
begin
result := 0;
k:=1;k1:=length(p)+1;
for i:=1 to length(s)-k1-1 do
begin
if p[k]=s[i] then inc(k) else k:=1;
if k=k1 then
begin
result:=i-k+2;
break;
end;
end;
Автор: DroN_S
Дата сообщения: 31.05.2005 17:33
OdesitVadim

Цитата:
Хотябы 3-4 строки.


Суппес Галина Александровна 1 д.Байкалово ул.Гагарина 78-23-10
Торопова Марзия Наримановна 3 д.Байкалово ул.Дорожная 78-54-17
Ульянова Нина Георгиевна 4 д.Байкалово ул.Дорожная 78-54-04
Хомякова Лидия Ивановна 10 д.Байкалово ул.Дорожная 78-54-71

В общем вот так...
Автор: OdesitVadim
Дата сообщения: 31.05.2005 17:58
DroN_S
Подожди,

Цитата:
Суппес Галина Александровна 1 д.Байкалово ул.Гагарина 78-23-10
Торопова Марзия Наримановна 3 д.Байкалово ул.Дорожная 78-54-17
Ульянова Нина Георгиевна 4 д.Байкалово ул.Дорожная 78-54-04
Хомякова Лидия Ивановна 10 д.Байкалово ул.Дорожная 78-54-71


Цитата:
Ф.И.О. Номер телефона Адрес проживания

Кто-то с нас глючит.
Как именно правильно?
Автор: DroN_S
Дата сообщения: 31.05.2005 19:49

Цитата:
Кто-то с нас глючит.
Как именно правильно?

Разве от перестановке слогаемых что-то меняется?
Автор: OdesitVadim
Дата сообщения: 31.05.2005 19:57
DroN_S

Цитата:
Разве от перестановке слогаемых что-то меняется?

Иногда ещё как!
Так как правильно?
Автор: Sleepwalker
Дата сообщения: 31.05.2005 21:38
OdesitVadim
в данном случае монопенисуально, как... поиск по подстроке, ищешь все вхождения...
Автор: DroN_S
Дата сообщения: 01.06.2005 22:46

Цитата:
в данном случае монопенисуально, как

Это точно, как сделать проверку каждого слова в строке?
Автор: Sleepwalker
Дата сообщения: 01.06.2005 23:15
DroN_S
зачем тебе проверка каждого слова в строке? в условии задачи указано: вывести все строки, соответсвующие условию. Вопрос в том, если условие задается более конкретно: что надо искать только по фамилии, например... или по телефону... хотя в данном случае пересечения при полном поиске очень маловероятны.... а вот если например нужно найти все телефоны, начинающиеся с ХХ, тогда да.. тут сложнее...
но решается опять же просто: делаешь разделителями в строке не пробелы а, например, табуляции (код символа 09), и тогда, зная номер позиции каждого элемента, можешь выбирать его и делать поиск только в нем... весь необходимый код тебе уже написали...
обозначь точнее ТЗ либо задача уже решена... имхо...
Автор: DroN_S
Дата сообщения: 02.06.2005 12:19
Sleepwalker
База, это просто сканиный текст с телефонного справочника, поэтому редактировать файл просто не реально...

Цитата:
зачем тебе проверка каждого слова в строке?

строка ведь состит из Ф.И.О. , места жительства и номера телефона, чтобы мне вывести строку, то мне и надо вводить полную строку, а мне надо чтобы вводя фамилию или номер телефона выводилась все похожие номера или фамилии. Или как Вы писали, ввели от фамилии три первые буквы и в поиске отражались все данные начинающиеся с этих трёх букв....
Автор: OdesitVadim
Дата сообщения: 02.06.2005 12:55
DroN_S
можно парсер написать. он будет разгребать текст. Всё таки там есть некоторые "указатели". И сразу в базу записывать. Могу написать впринципе
Автор: Sleepwalker
Дата сообщения: 02.06.2005 13:56
извините, может я тупой... или че не понимаю... но смысл в парсере?
Нужно найти вхождение в строку... ну и все.
Автор вопроса так и не уточнил, нужен ли ему просто поиск в строке или поиск по конкретному полю.
Автор: OdesitVadim
Дата сообщения: 02.06.2005 15:52
Sleepwalker
Смысл в том, что поиск по подстроке - это тоже парсер.
Ждём решения автора
Автор: Sleepwalker
Дата сообщения: 02.06.2005 16:17
OdesitVadim
не вижу никакого смысла именно в парсинге как в разборе строки по элементам.
Поиск в строке является частью парсинга, но никак не равен ему
все же уже описали: берем искомый шаблон, перебираем все строки и те, в которых данных шаблон есть (где pos>0) - выводим эту строку
Автор: DroN_S
Дата сообщения: 02.06.2005 16:52

Цитата:
поиск по конкретному полю.

да, пользователь знает адрес, он вводит его и ему выводятся все похожие фамилии и номера с адреса, или знает номер или знает фамилию...
Автор: Sleepwalker
Дата сообщения: 02.06.2005 17:19
DroN_S
И чего? у нас семантически сходство между ними минимальное... по-моему, можно просто искать в строке и не париться
Автор: DroN_S
Дата сообщения: 03.06.2005 13:41

Цитата:
искать в строке и не париться

что и требуется....
Автор: Sleepwalker
Дата сообщения: 03.06.2005 14:18
DroN_S
тогда тебе все уже давно написали, и не один раз
Автор: DroN_S
Дата сообщения: 03.06.2005 15:12
Sleepwalker

Цитата:
тогда тебе все уже давно написали, и не один раз

ткните пальцем на алгоритм поиска...

Страницы: 123

Предыдущая тема: интегрирование


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.