Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Поиск в текстовом документе

30K
17 января 2010 года
Morphling
74 / / 17.01.2010
Уважаемые форумчане, подскажите пожалуйста, Паскаль может производить поиск в текстовом файле? Если да, то какой процедурой это делается? Ну очень надо. Заранее спасибо.
536
17 января 2010 года
alex-kniaz
382 / / 07.08.2008
функция POS.
P.S.замечательно гуглится по "паскаль поиск текста в строке".
Если нужен разбор большого файла - читать его до конца и каждый раз pos-ить строку
30K
17 января 2010 года
Morphling
74 / / 17.01.2010
СПС ща попробую =))
307
17 января 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: alex-kniaz
функция POS.
P.S.замечательно гуглится по "паскаль поиск текста в строке".
Если нужен разбор большого файла - читать его до конца и каждый раз pos-ить строку



а если файл ну ооооочень большой, к примеру чисто теоретически 1гб-4гб?=)
да даже пусть хотя бы 300символов? если я не ошибаюсь максимальная длинна строки в паскале 255 символов, разве нет(бо не любитель я паскаля)?

в таком случае я думаю правильным решением будет читать из файла блоками по 255 символов, искать вхождение требуемой подстроки, затем читать следующий блок начиная с позиции cur_pos = cur_pos + 255 - (substring_len - 1), причем следует отслеживать так же конец файла, дабы не "начитать лишнего"!=))))

7
17 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Artem_3A
в таком случае я думаю правильным решением будет читать из файла блоками по 255 символов, искать вхождение требуемой подстроки, затем читать следующий блок начиная с позиции cur_pos = cur_pos + 255 - (substring_len - 1), причем следует отслеживать так же конец файла, дабы не "начитать лишнего"!=))))

Ага,а если искомая строка придётся как раз на разрыв между 1й и 2й порциями?Тогда придётся читать по 255-Length(SrcStr).Как-то так

5
17 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: @pixo $oft
Ага,а если искомая строка придётся как раз на разрыв между 1й и 2й порциями?Тогда придётся читать по 255-Length(SrcStr).Как-то так


Тогда придется использовать КМП не по строкам, по файлу (ибо и то и другое есть последовательность символов).

307
17 января 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: @pixo $oft
Ага,а если искомая строка придётся как раз на разрыв между 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 - количество блоков поместившихся в файл, однако это все равно в большинстве случаев эффективней и быстрее, чем писать, скажем, алгоритм Бойера-Мура(ну или если вам угодно Кнута — Морриса — Пратта, хотя алгоритм Бойера-Мура в идеале все таки шустрее) интерпретируя файл как строку, считывая данные посимвольно в ходе работы алгоритма, что будет связано с частыми перемещениями по файлу.

5
17 января 2010 года
hardcase
4.5K / / 09.08.2005
Цитата: Artem_3A
.... интерпретируя файл как строку, считывая данные посимвольно в ходе работы алгоритма, что будет связано с частыми перемещениями по файлу.

Ой, а буфер в памяти уже отменили? ;) Понятно, что можно читать "внахлест", но это по сути подгон входных данных под существующую функцию Pos.

307
17 января 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: hardcase
Ой, а буфер в памяти уже отменили? ;) Понятно, что можно читать "внахлест", но это по сути подгон входных данных под существующую функцию Pos.



его еще просто не изобрели! ;) :) :D

56K
20 января 2010 года
Eg-buk
1 / / 21.12.2009
Ну... Вообще тут одной процедурой не обойдется. Я так считаю:
Открываем файл, считываем каждую строку текста в 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;

307
20 января 2010 года
Artem_3A
863 / / 11.04.2008
Цитата: Eg-buk
Ну... Вообще тут одной процедурой не обойдется. Я так считаю:
Открываем файл, считываем каждую строку текста в 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;


а опять же если искомая подстрока придется на разрыв между строками? или вы предыдущие посты не читали, или не заметили предложенные там решения с обсуждением их плюсов и минусов?

253
20 января 2010 года
Proger_XP
1.5K / / 07.08.2004
Да чего тут мудрить, можно просто читать кусок в буфер, исать первый символ искомой строки там той же pos(), и при нахождении такового сравнивать оставшуюся строку. Если символ в конце прочитанного буфера, просто дочитываем необходимые байты.
8.2K
20 января 2010 года
bagie2
299 / / 26.10.2008
Я бы еще предложил юзать CreateFileMapping и rep cmpsd
253
20 января 2010 года
Proger_XP
1.5K / / 07.08.2004
CreateFileMapping в паскале? О_о Это по-моему win32api уже
8.2K
20 января 2010 года
bagie2
299 / / 26.10.2008
емае, я на раздел не обратил внимания. смотрю просто новые сообщения, думал Delphi)))
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог