uses
StrUtils;
var LongString: string;
SubString: string;
Position: integer;
Stream: TStream;
Stream:=TFileStream.Create(FileName,fmOpenRead)
SetString(LongString,Stream.Size);
Stream.Read(PChar(LongString)^,Stream.Size);
Stream.Free;
Position:=PosEx(LongString,SubString);
while Position>0 do begin
We_Found_Str_At_Position(Position);
Position:=PosEx(LongString, SubString, Position+Length(SubString));
end;
Помогите с поиском!
Уважаемые коллеги! Помогите плз найти алгоритм (подскажите идею) быстрого поиска строки в ЛЮБОМ (в т.ч. бинарном) файле. Варианты TStringList просьба не предлагать.
Цитата:
Originally posted by mindguru
Уважаемые коллеги! Помогите плз найти алгоритм (подскажите идею) быстрого поиска строки в ЛЮБОМ (в т.ч. бинарном) файле. Варианты TStringList просьба не предлагать.
Уважаемые коллеги! Помогите плз найти алгоритм (подскажите идею) быстрого поиска строки в ЛЮБОМ (в т.ч. бинарном) файле. Варианты TStringList просьба не предлагать.
А если КМП ?
Грузим файл в память, а дальше как ооочень длиную строку парсим КМП-шником... :)
Цитата:
Originally posted by hardcase
А если КМП ?
Грузим файл в память, а дальше как ооочень длиную строку парсим КМП-шником... :)
А если КМП ?
Грузим файл в память, а дальше как ооочень длиную строку парсим КМП-шником... :)
Ну типа да, токо я не знаю, шо такое КМП, а так всё нармальна!
поиск подстроки в каком угодно файле
Цитата:
Originally posted by hardcase
поиск подстроки в каком угодно файле
PosEx - использует алгоритм КМП (Кнута и друзей) поиска подстроки
поиск подстроки в каком угодно файле
PosEx - использует алгоритм КМП (Кнута и друзей) поиска подстроки
Да... Хитрый алгоритм! А 10М тоже прикажете в память одной строкой? Умники, блин...
Цитата:
Originally posted by mindguru
Да... Хитрый алгоритм! А 10М тоже прикажете в память одной строкой? Умники, блин...
Да... Хитрый алгоритм! А 10М тоже прикажете в память одной строкой? Умники, блин...
Система всё равно в своп будет скидывать память. В хелпах по делфи сказано - стринг может иметь размер до 2ГБ - Как ты думаешь, где он будет лежать?
А если хочешь еффективности - можно написать посиковик самому - в нете полно спецификаций КМП:
http://www.codenet.ru/progr/alg/kmp.php
http://ric.uni-altai.ru/Fundamental/pascal1/lab15/l15-teor.htm
В общих чертах: 8)
Грузишь страницу в пару метров, ищешь в ней, потом следущую, правда на стыках предётся попотеть...
Код:
const
PageSize: integer = 1048576; //1MB
var
Stream: TStream;
StrmPos: Int64;
Posit: integer;
Buffer: string;
BufSize: Int64;
while StramPos<Stream.Position do begin
BufSize:=Min(PageSize,Stream.Size-Stream.Position);
SetString(Buffer,BufSize);
Stream.Read(PChar(Buffer)^,BufSize);
Posit:=PosEx(Buffer,SubStr);
while Posit>0 do begin
We_Found_Str_At_Position(StrmPos+Posit);
Posit:=PosEx(Buffer,SubStr,Posit+Length(SubStr));
end;
Stream.Position:=Position-Length(SubStr)+1;
end;
PageSize: integer = 1048576; //1MB
var
Stream: TStream;
StrmPos: Int64;
Posit: integer;
Buffer: string;
BufSize: Int64;
while StramPos<Stream.Position do begin
BufSize:=Min(PageSize,Stream.Size-Stream.Position);
SetString(Buffer,BufSize);
Stream.Read(PChar(Buffer)^,BufSize);
Posit:=PosEx(Buffer,SubStr);
while Posit>0 do begin
We_Found_Str_At_Position(StrmPos+Posit);
Posit:=PosEx(Buffer,SubStr,Posit+Length(SubStr));
end;
Stream.Position:=Position-Length(SubStr)+1;
end;