Форум: "Основная";
Текущий архив: 2003.08.04;
Скачать: [xml.tar.bz2];
ВнизПоиск в текстовом файле. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c