Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.04;
Скачать: CL | DM;

Вниз

Поиск в текстовом файле.   Найти похожие ветки 

 
iNew ©   (2003-07-21 04:24) [0]

Дан текстовый файл, длина каждой строки в котором 80 символов.
Необходимо найти определенный набор символов(слово) в этом файле.
Если слово находится целиком в строке то нет проблем, а если начало слова в конце i-ой строки, а конец в начале i+1, причем никаких знаков переноса (типа ’-’ ) нет.
Самый простой вариант загнать в цикле весь файл в строку и с ней работать, но как-то уж слишком медленно получается.
Есть ли ещё варианты?


 
Babay ©   (2003-07-21 05:20) [1]

Наверное это тебе подойдет

Var sl:TStringList;
i:Integer;

begin
sl:=TStringList.create;
sl.loadFromFile("MyFile.txt");
i:=Pos("slovo",sl.text);// слово начинается с символа № i
.....
извлекаешь слово ежели надо
.....

sl.free
end;


 
Babay ©   (2003-07-21 06:14) [2]

Sorry невнимательно вопрос прочел.
Вот такой код на моей машине PIII - 660 256Mb самое дольше выполнялся 100 ms размер файла 1.32 Мб Искомое слово засунул в конец файла на разные строки

Var s:String;
i:Integer;
d:TDateTime;
h,m,sk,ms:Word;
sl:TStringList;
begin
d:=Now;
sl:=TStringList.Create;
sl.LoadFromFile("d:\pr.txt");
For i:=0 to sl.Count-1 do begin
s:=S+sl.Strings[i];
end;
Caption:=Inttostr(Pos("Slovo",s));
d:=Now-d;
DecodeTime(d,h,m,sk,ms);
Caption:=Caption+" "+Inttostr(m)+":"+Inttostr(sk)+":"+Inttostr(ms);
sl.Free;
end;


 
VMcL ©   (2003-07-21 09:21) [3]

>Babay © (21.07.03 05:20)

var
sl: TStringList;
i: Integer;
S: String;
begin
sl := TStringList.create;
try
sl.loadFromFile("MyFile.txt");
S := sl.Text;
finally
sl.free;
end;

i:=Pos("slovo",sl.text);// слово начинается с символа № i
//.....
//извлекаешь слово, ежели надо
//.....
end;


 
VMcL ©   (2003-07-21 09:33) [4]

>VMcL © (21.07.03 09:21)

Sorry.

i:=Pos("slovo", S);// слово начинается с символа № i


P. S.

А такой способ будет, наверное, ещё быстрее:

var
Stream: TStream;
I, Size: Integer;
S: string;
begin
Stream := TFileStream.Create("MyFile.txt", fmOpenRead or fmShareDenyWrite);
try
Size := Stream.Size - Stream.Position;
SetString(S, nil, Size);
Stream.Read(Pointer(S)^, Size);
finally
Stream.Free;
end;

I := Pos("slovo", S); // слово начинается с символа № i
//.....
//извлекаешь слово, ежели надо
//.....
end;


 
iNew ©   (2003-07-21 09:34) [5]

Дело в том, что в исходном файле есть определенные блоки, и если этот блок удовлетворяет опр. параметрам то я его записываю в File1, а в File2 всё что осталось. И если использовать
S := sl.Text, то почему-то в File1 и File2 эти блоки имеют не туже структуру, что в исходном файле (80 символов в строке), это важно. А если использовать
For i:=0 to sl.Count-1 do begin
s:=S+sl.Strings[i];
end;
То всё нормально.



Страницы: 1 вся ветка

Текущий архив: 2003.08.04;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-10144
DBDev
2003-07-11 15:40
2003.08.04
Проблемы с использованием dtsrun-a с клиентских машин!


8-10312
chyaynik
2003-04-13 16:58
2003.08.04
Текст на картинке


1-10174
Руслан
2003-07-20 11:28
2003.08.04
Компонент UpDown


1-10244
DimaB
2003-07-21 05:34
2003.08.04
Контрольная сумма


14-10411
tovSuhov
2003-07-17 13:36
2003.08.04
Вопрос немного не из той степи...