Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Поиск в файле


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

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

PPS если может кто, напишите процедуру поиска smile

Автор: SoWa 5.7.2005, 18:58
Код

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- это что ищем.

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

Автор: NoliX 5.7.2005, 19:05
Большое спасибо, щас проверю...

Автор: NoliX 5.7.2005, 19:09
Цитата
Чтобы искать в файле- читай строчки и в них ищи.


Слушай, а если я знаю что нужная мне запись всегда 4-тая с конца, но с начала по разному, как мне ее прочитать 4-той с конца?

Автор: Zlo 5.7.2005, 19:47
А что нельзя просто использавать функцию Pos?
А четвертая с конца строки или файла?

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


с конца файла...

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

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

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

Автор: Poseidon 5.7.2005, 21:33
Код
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.

Автор: NoliX 5.7.2005, 22:09
нет, народ, мне нужна 4-тая с конца строка из файла, а не из мемо и не 4 символа а строка...

Автор: Yanis 5.7.2005, 22:13
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;

Автор: Guest 5.7.2005, 22:19
Yanis

так, щас попробую...

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

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

Автор: NoliX 5.7.2005, 23:06
Зарегистрировался, еще и работает все =)

Автор: Vit 5.7.2005, 23:12
Если файл не очень большой, то что-то типа:

Код

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)