|
#1
|
|||
|
|||
Поисковик
Приветствую! Помогите мне, плиз... Такая задачка [Delphi7]:
Есть папка с файлами, все они текстовые(.txt) и состоят из коротких строк. Нужно искать во всех файлах определенное слово и если оно есть в файле то копировать всю строку (которая содержит искомое слово) в отдельный текстовый файл в той же папке. Как можно\лучше всё это реализовать, где об этом почитать (на великом и могучем желательно!). Хочу посмотреть на норм алгоритм более-менее оптимизированный. Может какие-нить компоненты для этого специальные есть? Звиняйте за нубство, Дельфи для себя открыл совсем недавно, а это мне необходимо понять именно сейчас... PS: Поиском ничего похожего не нашел. |
#2
|
|||
|
|||
Простой вариант - загрузка файлов в память (TStringList) и далее работа с данными в памяти. Все остальные варианты в силу объема твоего опыта нецелесообразны. Я в свое время сделал на следующем алгоритме:
-читаем файл блоками. -поиск идет сначала по 1-му символу строки -если символы совпадают, то проверяется второй символ. -если и второй символ совпадает, то вот тогда происходит сравнение всего шаблона. По поводу копирования строки, то тебе понадобится поиск вперед и назад до символов конца строки, а определив "координаты" этих символов, копировать нужную строку. |
#3
|
||||
|
||||
имена файлов то извесны?
|
#4
|
|||
|
|||
Цитата:
lmikle, т.е., если я правильно понял, то нечто вроде этого Только еще туда копирование строки, в которой нашлось слово прикрутить? |
#5
|
|||
|
|||
Если я правильно понял:
Код:
{FileName - файл в котором имена файлов} {SubStr - искомая строка} {предполагается, что файлы лежат в той же папке, где и FileName} procedure SearchText(FileName, SubStr: string); var i: integer; Path, CurrentFile: string; S: string; begin Path := ExtractFilePath(FileName); //Путь к файлам Files := TStringList.Create; //Список файлов в паке List := TStringList.Create; //Там будут строки try Files.LoadFromFile(FileName); for i := 0 to Files.Count - 1 do begin CurrentFile := Path + Files.Strings[i] + '.txt'; if FileExists(CurrentFile) = true then begin AssignFile(input, CurrentFile); Reset(input); while not eof(input) do begin Readln(S); if Pos(SubStr, S) > 0 then List.Add(S); end; CloseFile(input); end; end; List.SaveToFile(Path + 'List.txt'); except List.Free; Files.Free; end; end; procedure TForm1.Button1Click(Sender: TObject); begin SearchText('E:\1\Files.txt', 'aaa'); end; |
#6
|
|||
|
|||
ART, СПАСИБО!
Именно то что нужно. Проверил в работе - всё ок ищется и копируется как нужно.(только сначало не хотело компилиться из-за необъявленных переменных, добавил в var PHP код:
и всё стало норм, - откомпилилось (ты, видать, просто забыл объявить) Теперь буду изучать твой алг. ибо хочу понять как это работает (Да, и спасибо за оставленные комменты, так легче понимается! ) |