Поиск в текстовом документе
P.S.замечательно гуглится по "паскаль поиск текста в строке".
Если нужен разбор большого файла - читать его до конца и каждый раз pos-ить строку
P.S.замечательно гуглится по "паскаль поиск текста в строке".
Если нужен разбор большого файла - читать его до конца и каждый раз pos-ить строку
а если файл ну ооооочень большой, к примеру чисто теоретически 1гб-4гб?=)
да даже пусть хотя бы 300символов? если я не ошибаюсь максимальная длинна строки в паскале 255 символов, разве нет(бо не любитель я паскаля)?
в таком случае я думаю правильным решением будет читать из файла блоками по 255 символов, искать вхождение требуемой подстроки, затем читать следующий блок начиная с позиции cur_pos = cur_pos + 255 - (substring_len - 1), причем следует отслеживать так же конец файла, дабы не "начитать лишнего"!=))))
Ага,а если искомая строка придётся как раз на разрыв между 1й и 2й порциями?Тогда придётся читать по 255-Length(SrcStr).Как-то так
Тогда придется использовать КМП не по строкам, по файлу (ибо и то и другое есть последовательность символов).
не придется, на этот случай мы как раз и читаем на каждой итерации не с позиции i*255, где i - номер считываемого блока, а с позиции cur_pos += 255 - (substring_len - 1). Первоначально cur_pos = 0. Смещением на величину (substring_len - 1) мы обрабатываем самый худший случай, когда вся подстрока за исключением одного символа оказалась в считанном блоке, в то время когда последний символ оказался в следующем по счету блоке. Правда при этом получается что мы прочтем дважды (substring_len - 1)*N символов из файла, где N - количество блоков поместившихся в файл, однако это все равно в большинстве случаев эффективней и быстрее, чем писать, скажем, алгоритм Бойера-Мура(ну или если вам угодно Кнута — Морриса — Пратта, хотя алгоритм Бойера-Мура в идеале все таки шустрее) интерпретируя файл как строку, считывая данные посимвольно в ходе работы алгоритма, что будет связано с частыми перемещениями по файлу.
Ой, а буфер в памяти уже отменили? ;) Понятно, что можно читать "внахлест", но это по сути подгон входных данных под существующую функцию Pos.
его еще просто не изобрели! ;) :) :D
Открываем файл, считываем каждую строку текста в array of string и идем искать по массиву:
var: x,f,t,p,k:integer; y: array[1..(ну сколько там в массиве... ну 100 строк) of string; z,n: string;
...
f:= Length(z(собственно z - то, что мы ищим))
for x:= 1 to 100 do
Begin
t:= Length(y[x]);
for p:= 1 to t do
Begin
for k:= p to (p + f) do
Begin
n:= n + y[k]
;
End;
if n = z then Нашел!
End;
End;
Открываем файл, считываем каждую строку текста в array of string и идем искать по массиву:
...
f:= Length(z(собственно z - то, что мы ищим))
for x:= 1 to 100 do
Begin
t:= Length(y[x]);
for p:= 1 to t do
Begin
for k:= p to (p + f) do
Begin
n:= n + y[k];
End;
if n = z then Нашел!
End;
End;
а опять же если искомая подстрока придется на разрыв между строками? или вы предыдущие посты не читали, или не заметили предложенные там решения с обсуждением их плюсов и минусов?