Как сделать поиск в текстовом файле, например, есть текстовой файл с заполнением в следующем порядке: фамилия, имя, отчество, адрес, номер телефона, адрес. Заполнение ведётся в одну строку. Надо чтобы при вводе одного из перечисленных названий, выводились результата поиска в файле. Например: ввели номер 458965, и например в RichEdit'e вывелись все фамилии которые схожи с заданным номером в данном текстовом файле. Подскажите как это сделать?
» Поиск в текстовом файле
Советую сначала перегнат в любую базу данных.
Если же именно текст, то можно считать все в одну строку и искать pos-м... но это будет некорректно.
Можно считывать построчно и анализировать каждую строчку с помощью pos
Если же именно текст, то можно считать все в одну строку и искать pos-м... но это будет некорректно.
Можно считывать построчно и анализировать каждую строчку с помощью pos
Цитата:
Можно считывать построчно и анализировать каждую строчку с помощью pos
Можно пример кода...
DroN_S - здесь посмотри - профессинально сделано :
http://delphiworld.narod.ru/base/search_text_in_text_file.html
Вообще то файл структурирован ? т.е. фамилия - n поз. в строке, имя - n+i1 поз. в строке, и т.п.. ? Строка - обычная (<256 end cr/lf) ?
Чтото подобное у меня валялось - поищу на работе если надо.
Хотя совет-решение YurikGL (БД) - считаю более предпочтительным.
http://delphiworld.narod.ru/base/search_text_in_text_file.html
Вообще то файл структурирован ? т.е. фамилия - n поз. в строке, имя - n+i1 поз. в строке, и т.п.. ? Строка - обычная (<256 end cr/lf) ?
Чтото подобное у меня валялось - поищу на работе если надо.
Хотя совет-решение YurikGL (БД) - считаю более предпочтительным.
YurikGL
Цитата:
Пушкой по воробъях?
DroN_S
простой вариант
Код:
reset(f);
while not eof(f) do
begin
readln(f,s);//Читаем строку с файла
if (<здесь условие, проверяющее подходит ли номер>) then RichEdit1.lines.add(s);
end;
closefile(f);
Цитата:
Советую сначала перегнат в любую базу данных.
Пушкой по воробъях?
DroN_S
простой вариант
Код:
reset(f);
while not eof(f) do
begin
readln(f,s);//Читаем строку с файла
if (<здесь условие, проверяющее подходит ли номер>) then RichEdit1.lines.add(s);
end;
closefile(f);
Цитата:
Пушкой по воробъях?
Меня смущает номер 458965
Если там подобное количество записей, то это - но воробей, хотя и не орел
Кстати, если не ошибаюсь, были какие-то драйверы в ADO, которые позволяли напрямую к текствому файлу, как к БД обращаться...
YurikGL
Цитата:
читай первый пост! там явно сказано, что этот номер = телефонный. А раз так, то всё нормально.
Цитата:
Да такие есть. там только файл-схему описать нужно. Но тормознутые - у меня десяток записей по пару полей - с секунду выборка (мож меньше, но на глаз заметно и сильно)
Цитата:
Меня смущает номер 458965
читай первый пост! там явно сказано, что этот номер = телефонный. А раз так, то всё нормально.
Цитата:
Кстати, если не ошибаюсь, были какие-то драйверы в ADO, которые позволяли напрямую к текствому файлу, как к БД обращаться...
Да такие есть. там только файл-схему описать нужно. Но тормознутые - у меня десяток записей по пару полей - с секунду выборка (мож меньше, но на глаз заметно и сильно)
Прошу прощения :
OdesitVadim
Цитата:
Т.е. в цикле выполняется поиск заданной подстроки (метод brute force) :
Цитата:
Но вообще то даже нерадивым студентам известен алгоритм Бойера-Мура (если текст большой и поисковая строка велика). Дело вкуса.
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)
Но вообще то даже нерадивым студентам известен алгоритм Бойера-Мура (если текст большой и поисковая строка велика). Дело вкуса.
Цитата:
так как не знаю точного формата строки в файле,
Формат строки следующий:
Ф.И.О. Номер телефона Адрес проживания
wellwisher
Я же не написал как реализовать условия (в явном виде). Как вариант, предложил поиск. Даже если применять алгоритм Бойера-Мура, строку всёравно нужно пропарсить, так как нужно найти нужное поле (иначе например, например индекс в адресе может совпадать с номером телефона - будет ложная выборка.) номер телефона не может быть очень длиным (по медждународным нормам - 12 цифр и плюсик, кажеться).
DroN_S
ты не совсем ответил на вопрос. Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?
Я же не написал как реализовать условия (в явном виде). Как вариант, предложил поиск. Даже если применять алгоритм Бойера-Мура, строку всёравно нужно пропарсить, так как нужно найти нужное поле (иначе например, например индекс в адресе может совпадать с номером телефона - будет ложная выборка.) номер телефона не может быть очень длиным (по медждународным нормам - 12 цифр и плюсик, кажеться).
DroN_S
ты не совсем ответил на вопрос. Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?
Цитата:
Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?
Нет никакой привязки к полям и пробелы никакой роли не играют....
DroN_S
Обычно записи разделяются к примеру одним(хотя бы)пробелом. Если в Фио может быть 3 или 4 или неизвестно сколько пробелов, то задача попахивает искуственным интелектом - так как прийдётся думать как выделять.
Мож приведёш кусок файла? Хотябы 3-4 строки. И это преподы задали?
Обычно записи разделяются к примеру одним(хотя бы)пробелом. Если в Фио может быть 3 или 4 или неизвестно сколько пробелов, то задача попахивает искуственным интелектом - так как прийдётся думать как выделять.
Мож приведёш кусок файла? Хотябы 3-4 строки. И это преподы задали?
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;
откуда взял алгоритм?
все проще:
Код:
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;
OdesitVadim
Цитата:
Суппес Галина Александровна 1 д.Байкалово ул.Гагарина 78-23-10
Торопова Марзия Наримановна 3 д.Байкалово ул.Дорожная 78-54-17
Ульянова Нина Георгиевна 4 д.Байкалово ул.Дорожная 78-54-04
Хомякова Лидия Ивановна 10 д.Байкалово ул.Дорожная 78-54-71
В общем вот так...
Цитата:
Хотябы 3-4 строки.
Суппес Галина Александровна 1 д.Байкалово ул.Гагарина 78-23-10
Торопова Марзия Наримановна 3 д.Байкалово ул.Дорожная 78-54-17
Ульянова Нина Георгиевна 4 д.Байкалово ул.Дорожная 78-54-04
Хомякова Лидия Ивановна 10 д.Байкалово ул.Дорожная 78-54-71
В общем вот так...
DroN_S
Подожди,
Цитата:
Цитата:
Кто-то с нас глючит.
Как именно правильно?
Подожди,
Цитата:
Суппес Галина Александровна 1 д.Байкалово ул.Гагарина 78-23-10
Торопова Марзия Наримановна 3 д.Байкалово ул.Дорожная 78-54-17
Ульянова Нина Георгиевна 4 д.Байкалово ул.Дорожная 78-54-04
Хомякова Лидия Ивановна 10 д.Байкалово ул.Дорожная 78-54-71
Цитата:
Ф.И.О. Номер телефона Адрес проживания
Кто-то с нас глючит.
Как именно правильно?
Цитата:
Кто-то с нас глючит.
Как именно правильно?
Разве от перестановке слогаемых что-то меняется?
DroN_S
Цитата:
Иногда ещё как!
Так как правильно?
Цитата:
Разве от перестановке слогаемых что-то меняется?
Иногда ещё как!
Так как правильно?
OdesitVadim
в данном случае монопенисуально, как... поиск по подстроке, ищешь все вхождения...
в данном случае монопенисуально, как... поиск по подстроке, ищешь все вхождения...
Цитата:
в данном случае монопенисуально, как
Это точно, как сделать проверку каждого слова в строке?
DroN_S
зачем тебе проверка каждого слова в строке? в условии задачи указано: вывести все строки, соответсвующие условию. Вопрос в том, если условие задается более конкретно: что надо искать только по фамилии, например... или по телефону... хотя в данном случае пересечения при полном поиске очень маловероятны.... а вот если например нужно найти все телефоны, начинающиеся с ХХ, тогда да.. тут сложнее...
но решается опять же просто: делаешь разделителями в строке не пробелы а, например, табуляции (код символа 09), и тогда, зная номер позиции каждого элемента, можешь выбирать его и делать поиск только в нем... весь необходимый код тебе уже написали...
обозначь точнее ТЗ либо задача уже решена... имхо...
зачем тебе проверка каждого слова в строке? в условии задачи указано: вывести все строки, соответсвующие условию. Вопрос в том, если условие задается более конкретно: что надо искать только по фамилии, например... или по телефону... хотя в данном случае пересечения при полном поиске очень маловероятны.... а вот если например нужно найти все телефоны, начинающиеся с ХХ, тогда да.. тут сложнее...
но решается опять же просто: делаешь разделителями в строке не пробелы а, например, табуляции (код символа 09), и тогда, зная номер позиции каждого элемента, можешь выбирать его и делать поиск только в нем... весь необходимый код тебе уже написали...
обозначь точнее ТЗ либо задача уже решена... имхо...
Sleepwalker
База, это просто сканиный текст с телефонного справочника, поэтому редактировать файл просто не реально...
Цитата:
строка ведь состит из Ф.И.О. , места жительства и номера телефона, чтобы мне вывести строку, то мне и надо вводить полную строку, а мне надо чтобы вводя фамилию или номер телефона выводилась все похожие номера или фамилии. Или как Вы писали, ввели от фамилии три первые буквы и в поиске отражались все данные начинающиеся с этих трёх букв....
База, это просто сканиный текст с телефонного справочника, поэтому редактировать файл просто не реально...
Цитата:
зачем тебе проверка каждого слова в строке?
строка ведь состит из Ф.И.О. , места жительства и номера телефона, чтобы мне вывести строку, то мне и надо вводить полную строку, а мне надо чтобы вводя фамилию или номер телефона выводилась все похожие номера или фамилии. Или как Вы писали, ввели от фамилии три первые буквы и в поиске отражались все данные начинающиеся с этих трёх букв....
DroN_S
можно парсер написать. он будет разгребать текст. Всё таки там есть некоторые "указатели". И сразу в базу записывать. Могу написать впринципе
можно парсер написать. он будет разгребать текст. Всё таки там есть некоторые "указатели". И сразу в базу записывать. Могу написать впринципе
извините, может я тупой... или че не понимаю... но смысл в парсере?
Нужно найти вхождение в строку... ну и все.
Автор вопроса так и не уточнил, нужен ли ему просто поиск в строке или поиск по конкретному полю.
Нужно найти вхождение в строку... ну и все.
Автор вопроса так и не уточнил, нужен ли ему просто поиск в строке или поиск по конкретному полю.
Sleepwalker
Смысл в том, что поиск по подстроке - это тоже парсер.
Ждём решения автора
Смысл в том, что поиск по подстроке - это тоже парсер.
Ждём решения автора
OdesitVadim
не вижу никакого смысла именно в парсинге как в разборе строки по элементам.
Поиск в строке является частью парсинга, но никак не равен ему
все же уже описали: берем искомый шаблон, перебираем все строки и те, в которых данных шаблон есть (где pos>0) - выводим эту строку
не вижу никакого смысла именно в парсинге как в разборе строки по элементам.
Поиск в строке является частью парсинга, но никак не равен ему
все же уже описали: берем искомый шаблон, перебираем все строки и те, в которых данных шаблон есть (где pos>0) - выводим эту строку
Цитата:
поиск по конкретному полю.
да, пользователь знает адрес, он вводит его и ему выводятся все похожие фамилии и номера с адреса, или знает номер или знает фамилию...
DroN_S
И чего? у нас семантически сходство между ними минимальное... по-моему, можно просто искать в строке и не париться
И чего? у нас семантически сходство между ними минимальное... по-моему, можно просто искать в строке и не париться
Цитата:
искать в строке и не париться
что и требуется....
DroN_S
тогда тебе все уже давно написали, и не один раз
тогда тебе все уже давно написали, и не один раз
Sleepwalker
Цитата:
ткните пальцем на алгоритм поиска...
Цитата:
тогда тебе все уже давно написали, и не один раз
ткните пальцем на алгоритм поиска...
Предыдущая тема: интегрирование
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.