Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в файле, подстрока в строке 
:(
    Опции темы
NoliX
Дата 5.7.2005, 18:51 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Народ, помогите, нужно организовать поиск подстроки в строке, точнее в файле, текстовом, скорость не важна...

PS все облазил ничего путного не нашел, разве что исходники на си, но это мне не подходит...

PPS если может кто, напишите процедуру поиска smile
  Вверх
SoWa
  Дата 5.7.2005, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 2
Всего: 74



Код

function BMSearch(StartPos: Integer; const S, P: string): Integer;
type
  TBMTable = array[0..255] of Integer;
var
  Pos, lp, i: Integer;
  BMT: TBMTable;
begin

  for i := 0 to 255 do
    BMT[i] := Length(P);
  for i := Length(P) downto 1 do
    if BMT[Byte(P[i])] = Length(P) then
      BMT[Byte(P[i])] := Length(P) - i;

  lp := Length(P);
  Pos := StartPos + lp - 1;
  while Pos <= Length(S) do
    if P[lp] <> S[Pos] then
      Pos := Pos + BMT[Byte(S[Pos])]
    else if lp = 1 then
    begin
      Result := Pos;
      Exit;
    end
    else
      for i := lp - 1 downto 1 do
        if P[i] <> S[Pos - lp + i] then
        begin
          Inc(Pos);
          Break;
        end
        else if i = 1 then
        begin
          Result := Pos - lp + 1;
          Exit;
        end;
  Result := 0;

end;


алгоритм Бойера-Мура
ф-ия возвращает первое вхождение подстроки в строку
работает быстро

Пример использования:
Код

BMSearch(1, 'dsade', 'de')
// в данном примере ф-ия возвратит число 4
// 1 - это позиция с которой ищем подстроку в строке


ЗЫ
"const S, P: string):"
Const можешь убрать.
S- это в какой строке
P- это что ищем.

Чтобы искать в файле- читай строчки и в них ищи.

Это сообщение отредактировал(а) SoWa - 5.7.2005, 19:00


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
NoliX
Дата 5.7.2005, 19:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Большое спасибо, щас проверю...
  Вверх
NoliX
Дата 5.7.2005, 19:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
Чтобы искать в файле- читай строчки и в них ищи.


Слушай, а если я знаю что нужная мне запись всегда 4-тая с конца, но с начала по разному, как мне ее прочитать 4-той с конца?
  Вверх
Zlo
Дата 5.7.2005, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: 1
Всего: 1



А что нельзя просто использавать функцию Pos?
А четвертая с конца строки или файла?
PM MAIL   Вверх
NoliX
Дата 5.7.2005, 21:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата
А что нельзя просто использавать функцию Pos?
А четвертая с конца строки или файла?


с конца файла...
  Вверх
Yanis
Дата 5.7.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Конечно, если строка всегда 4, то можно и простенько:
Код

  ShowMEssage(Memo1.Lines.Strings[Memo1.Lines.Count-4]);

Таким образом можно получить 4 строку с конца файла (текстового) smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Poseidon
Дата 5.7.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Код
function(FileName: string):string;
var
f: TextFile;
txt: string;
begin
AssignFile(f,FileName);
Reset(f);
Read(f,txt);
CloseFile(f);
Result:= copy(txt,Length(txt)-3,4);
end;


Функция возвращает последние 4 символа текстового файла FileName.

Это сообщение отредактировал(а) Poseidon - 5.7.2005, 21:34


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
NoliX
Дата 5.7.2005, 22:09 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











нет, народ, мне нужна 4-тая с конца строка из файла, а не из мемо и не 4 символа а строка...
  Вверх
Yanis
Дата 5.7.2005, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



2 NoliX
Можно из Memo, можно и из файла. Какая разница?
Код

var
  l: TStringList;
begin
  l := TStringList.Create;
  l.LoadFromFile('C:\WINDOWS\win.ini');
  ShowMEssage(l.Strings[l.Count-4]);
  l.Free;
end;


Это сообщение отредактировал(а) Yanis - 5.7.2005, 22:15


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
Guest
Дата 5.7.2005, 22:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Yanis

так, щас попробую...
  Вверх
Yanis
Дата 5.7.2005, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

Репутация: 72
Всего: 111



Цитата(Guest @ 5.7.2005, 22:19)
так, щас попробую...

Сначала попробуй зарегистрироваться smile


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
NoliX
Дата 5.7.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 5.7.2005

Репутация: нет
Всего: 1



Зарегистрировался, еще и работает все =)
--------------------
Опыт - это учитель, который очень дорого берет за свои уроки
PM MAIL   Вверх
Vit
Дата 5.7.2005, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Если файл не очень большой, то что-то типа:

Код

With TStringList.create do
  try
    LoadFromFile('c:\MyFile.txt');
    for i:=0 to count-1 do
       is pos('My string', strings[i])>0 then
         showmessage(strings[i])
  finally
    free;
  end;



--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0520 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.