Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Поиск в текстовом файле

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4

Открыть новую тему     Написать ответ в эту тему

DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как сделать поиск в текстовом файле, например, есть текстовой файл с заполнением в следующем порядке: фамилия, имя, отчество, адрес, номер телефона, адрес. Заполнение ведётся в одну строку. Надо чтобы при вводе одного из перечисленных названий, выводились результата поиска в файле. Например: ввели номер 458965, и например в RichEdit'e вывелись все фамилии которые схожи с заданным номером в данном текстовом файле. Подскажите как это сделать?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 11:35 29-05-2005 | Исправлено: DroN_S, 11:38 29-05-2005
YurikGL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Советую сначала перегнат в любую базу данных.
 
Если же именно текст, то можно считать все в одну строку и искать pos-м... но это будет некорректно.
Можно считывать построчно и анализировать каждую строчку с помощью pos

Всего записей: 308 | Зарегистр. 02-09-2004 | Отправлено: 12:01 29-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Можно пример кода...

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 13:01 29-05-2005
wellwisher



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

Всего записей: 922 | Зарегистр. 21-03-2005 | Отправлено: 00:45 30-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YurikGL

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

Пушкой по воробъях?
 
DroN_S
простой вариант

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

Учловие написать не могу, так как не знаю точного формата строки в файле, но её всегда можно найти с помощю pos, copy и delete.
Правда
Цитата:
 все фамилии которые схожи с заданным номером

Это как?

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 11:51 30-05-2005
YurikGL



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

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

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

Всего записей: 308 | Зарегистр. 02-09-2004 | Отправлено: 19:34 30-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
YurikGL

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

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

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

Да такие есть. там только файл-схему описать нужно. Но тормознутые - у меня десяток записей по пару полей - с секунду выборка (мож меньше, но на глаз заметно и сильно)

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 19:47 30-05-2005
wellwisher



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Прошу прощения :
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)
 

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

Всего записей: 922 | Зарегистр. 21-03-2005 | Отправлено: 20:57 30-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Формат строки следующий:
Ф.И.О.         Номер телефона           Адрес проживания  

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 12:02 31-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
wellwisher
Я же не написал как реализовать условия (в явном виде). Как вариант, предложил поиск. Даже если применять алгоритм Бойера-Мура, строку всёравно нужно пропарсить, так как нужно найти нужное поле (иначе например, например индекс в адресе может совпадать с номером телефона - будет ложная выборка.) номер телефона не может быть очень длиным (по медждународным нормам - 12 цифр и плюсик, кажеться).
DroN_S
ты не совсем ответил на вопрос.  Привязаны ли поля к конкретным позициям (например телефонный номер начинается с 20 позиции) или по пробелам отсчитать надо?

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 14:49 31-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Нет никакой привязки к полям и пробелы никакой роли не играют....

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:43 31-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S
Обычно записи разделяются к примеру одним(хотя бы)пробелом. Если в Фио может быть 3 или 4 или неизвестно сколько пробелов, то задача попахивает искуственным интелектом - так как прийдётся думать как выделять.
Мож приведёш кусок файла? Хотябы 3-4 строки. И это преподы задали?

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:59 31-05-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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;
 

 
по-моему, значительно проще... хотя, если компилятор хорошо оптимизирует, то не большая разница.. но судя по тому, что это паскаль... вряд ли
 
Добавлено:
Гы.. по приколу... провел поиск в строке длинной 10 Метров... pos() благополучно скончался, мой метод получился примерно втрое быстрее, чем у wellwisher.
 
 
 
Добавлено:
а по теме... да собсно все уже сказали

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 17:09 31-05-2005 | Исправлено: Sleepwalker, 17:32 31-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim

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

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

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 18:33 31-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S
Подожди,

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


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

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

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 18:58 31-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 20:49 31-05-2005
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S

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

Иногда ещё как!
Так как правильно?

----------
Press any key to continue or any other key to exit
Пишите так, чтобы не было стыдно за нобелевскую премию.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 20:57 31-05-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
в данном случае монопенисуально, как... поиск по подстроке, ищешь все вхождения...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 22:38 31-05-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

Это точно, как сделать проверку каждого слова в строке?

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 23:46 01-06-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DroN_S
зачем тебе проверка каждого слова в строке? в условии задачи указано: вывести все строки, соответсвующие условию. Вопрос в том, если условие задается более конкретно: что надо искать только по фамилии, например... или по телефону... хотя в данном случае пересечения при полном поиске очень маловероятны.... а вот если например нужно найти все телефоны, начинающиеся с ХХ, тогда да.. тут сложнее...  
но решается опять же просто: делаешь разделителями в строке не пробелы а, например, табуляции (код символа 09), и тогда, зная номер позиции каждого элемента, можешь выбирать его и делать поиск только в нем... весь необходимый код тебе уже написали...
обозначь точнее ТЗ либо задача уже решена... имхо...

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 00:15 02-06-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Поиск в текстовом файле


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2025

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru