Fail

6 отговора 176 прегледа
#1

Fail

Triabvat mi fynktsii za tarsene na niz v tekstov fail na Delphi6

Отговор
в отговор на Pesho #2

Re: Fail

Прочети го в низ - например чрез LoadFromFile на TStringList, и ползвай pos ()

чети и дишай по-леко
Отговор
в отговор на Pechenia #3

Re: Fail

Обаче какъвто и проблем да има Pechenia го решава със StringList :) Къде отидоха добрите стари AssignFile & Co. ? :)

Иначе по-подробно:

зареждаш в един тСтрингЛист файла с LoadFromFile метода, после в цикъл подобен на

var

sl: TStringList;
...
sl := TStringList.Create;
sl.LoadFromFile(FILE_NAME);

for i := 0 to sl.Count - 1 do begin
if Pos(S {tvoqstring}, sl[ i ]) <> 0 then begin
{ obrabotka na namereniq string }
end;
end;

-

Отново едит на темата: Обаче идеята не е най-добрата, защото ако търсим стринг 'абв где', а той във файла е
'абв
где'
с този подход няма да го намерим.

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #4

Re: Fail

Abe i az taka si pomislix ama ne mislia,parvo pisha sled mislia.Moiata ideia
var F:textfile;
var S:String;
begin
reset(F);
while not eof(F) do
begin
readln(F,S);
if Pos(niz,S)>0 then {neshto si...}
end;
close(F);

Отговор
в отговор на Pesho #5

Редактирах си мнението

Отново едит на темата: Обаче идеята не е най-добрата, защото ако търсим стринг 'абв где', а той във файла е
'абв
где'
с този подход няма да го намерим.


-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на Pesho #6

Re: Fail

Функция за такова нещо няма - и никога няма да има в Delphi.
Погледнах другите мнения - и ми стана интересно колко време ще се чака зареждането на 400 MB файл примерно - та после да започне търсенето в него. Слава Богу обаче задачката не е такава .
А това което съм дал е нещо като алгоритъм за големи файлове - ако не искаш да ползваш stream. Разбира се не си предпазен от горния проблем - във файла да имаш нов ред - а ти в низа да се опиташ да го смениш с интервал - то и това си има начин да го оправиш ама е доста играчка.
Ползвай буфер в който да си четеш парче от файла - като буфера трябва да се по-голям от дължината на търсения текст - най добре няколко пъти поне за да се оптимизира четенето от файла.
За първия пас - четеш целия буфер и търсиш в него, за всеки следващ - изместваш буфера така че в него да останат последните Х символа - където Х е дължинтата на низа който търсиш - и прочиташ парче което да се събере в остатъка на буфер. Разбира се този метод далеч не е най-добрия - но другите са по-сложни за реализация.

---
Е т'ва е живот!

Редактирано от PhantomAS на

Отговор
в отговор на z_free #7

Re: Fail

Печения е мързел, и следва основната концепция за Delphi - повече мисъл, по-малко код.
Относно твоята реализация аз съм критично настроен, щото StringList-а има свойство Text, където е целия текст и е достатъчен един pos:


with TStringList.Create do
try
LoadFromFile ('aaa');
if pos ('tursenoto',Text) then ...
finally
Free;
end;


Това решава въпроса със средни по-размер файлове. За тлъсти файлове основна роля играе бързодействието, тогава има много врътки, които при желание мога да развия тук. Но в 98% от случаите мързела е достатъчен.

чети и дишай по-леко
Отговор