Перейти к содержанию
СофтФорум - всё о компьютерах и не только

поиск в текстовых файлах


Рекомендуемые сообщения

Привет всем

мне надо написать такую прогу которая бы искала заданную строку

в текстовых файлах и потом выдавала результат в виде списка по которому

можно было бы из своей проги перейти к нужной(найденной) позиции файла

короче как это сделано в delphi Find in files.

подкиньте пожалуйста каких нибудь идей на счёт этого.

Ссылка на комментарий
Поделиться на другие сайты

Сначало тебе надо найти всех файлов в директории

procedure FindFiles;

var

l: integer;

F: TSearchRec;

begin

l=0;

if FindFirst('*.txt', faAnyFile, F)=0 then

begin

repeat

inc(l)

files[l]:=f.Name;

until FindNext(F)<>0;

end;

FindClose(F);

end;

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

У меня нет времени написать остольное, надеюсь ето поможет тебе

Желаю удачи

Ссылка на комментарий
Поделиться на другие сайты

Во-первых, для поиска текста в указанном файле и получения позиции строки в указанном файле, воспользуйся этой процедурой. Возвращает позицию указанной строки, или -1, если она не найдена.

function ScanFile(const FileName: string;  const forString: string;  caseSensitive: Boolean): Longint;  { returns position of string in file or -1, if not found } const  BufferSize = $8001;  { 32K+1 bytes } var  pBuf, pEnd, pScan, pPos: PChar;  filesize: LongInt;  bytesRemaining: LongInt;  bytesToRead: Word;  F: file;  SearchFor: PChar;  oldMode: Word; begin  Result := -1;  { assume failure }  if (Length(forString) = 0) or (Length(FileName) = 0) then Exit;  SearchFor := nil;  pBuf      := nil;  { open file as binary, 1 byte recordsize }  AssignFile(F, FileName);  oldMode  := FileMode;  FileMode := 0;    { read-only access }  Reset(F, 1);  FileMode := oldMode;  try { allocate memory for buffer and pchar search string }    SearchFor := StrAlloc(Length(forString) + 1);    StrPCopy(SearchFor, forString);    if not caseSensitive then  { convert to upper case }      AnsiUpper(SearchFor);    GetMem(pBuf, BufferSize);    filesize       := System.Filesize(F);    bytesRemaining := filesize;    pPos           := nil;    while bytesRemaining > 0 do     begin      { calc how many bytes to read this round }      if bytesRemaining >= BufferSize then        bytesToRead := Pred(BufferSize)      else        bytesToRead := bytesRemaining;      { read a buffer full and zero-terminate the buffer }      BlockRead(F, pBuf^, bytesToRead, bytesToRead);      pEnd  := @pBuf[bytesToRead];      pEnd^ := #0;       { scan the buffer. Problem: buffer may contain #0 chars! So we         treat it as a concatenation of zero-terminated strings. }      pScan := pBuf;      while pScan < pEnd do       begin        if not caseSensitive then { convert to upper case }          AnsiUpper(pScan);        pPos := StrPos(pScan, SearchFor);  { search for substring }        if pPos <> nil then         begin { Found it! }          Result := FileSize - bytesRemaining +            Longint(pPos) - Longint(pBuf);          Break;        end;        pScan := StrEnd(pScan);        Inc(pScan);      end;      if pPos <> nil then Break;      bytesRemaining := bytesRemaining - bytesToRead;      if bytesRemaining > 0 then       begin       { no luck in this buffers load. We need to handle the case of         the search string spanning two chunks of file now. We simply         go back a bit in the file and read from there, thus inspecting         some characters twice       }        Seek(F, FilePos(F) - Length(forString));        bytesRemaining := bytesRemaining + Length(forString);      end;    end; { While }  finally    CloseFile(F);    if SearchFor <> nil then StrDispose(SearchFor);    if pBuf <> nil then FreeMem(pBuf, BufferSize);  end; end; { ScanFile }

Теперь небольшая адаптация под твои запросы:

1) Если файлы, в которых тебе надо искать строку, известны и лежат в каком-либо списке или массиве, то небольшой пример таков. Пусть, есть следующие переменные:

FileList : TStringList; //Список путей к файлам для поиска строки

SearchStr : String; //Строка для поиска

И объекты на форме:

ListView1 - Список результатов. Формат отображения стоит vsReport. Две колонки - Имя файла и Позиция.

Memo1 - В него будет загружаться файл и осуществляться переход на нужную позицию

Поиск файлов

const SearchStr='Строка для поиска';var I:Integer; FileList : TStringList; CurPos : Integer; N:TListItem;begin ListView1.Items.Clear; For I := 0 to FileList.Count-1 do   begin     CurPos:=ScanFile(FileList[i], SearchStr, False);     If CurPos=-1 then Continue;     N:=ListView1.Items.Add;     N.Caption:=ExtractFileName(FileList[i]);     N.SubItems.Add(IntToStr(CurPos));   end;end;

Отображение. Процедура OnDoubleClick компоненты ListView1

var CurFile:String; CurPos:Integer;  begin If ListView1.ItemIndex<0 then Exit; CurFile:=ListView1.Items[ListView1.ItemIndex].Caption; CurPos:=StrToInt(ListView1.Items[ListView1.ItemIndex].SubItems[0]); Memo1.Lines.LoadFromFile(CurFile); Memo1.SelStart:=CurPos; Memo1.SetFocus;end;

Вроде все...

Ссылка на комментарий
Поделиться на другие сайты

Спасибо за ответы.

у меня ещё вопросы , моя программа должна искать строку в файлах html

и выдавать результат в TWebBrowser вместо TMemo ,но в html теги тоже будут

попадать в обработку и в результате отображения курсор встанет не на нужное место-как можно исключить из обработки теги? и эта процедура после первого

нахождения строки остальную часть файла пропускает? и как можно прокрутить TWebBrowser вслед за установленным курсором? и как сделать чтоб

курсор переходил не к позиции в строке ,а к началу самой строки.

пока.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...