powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск в строке
6 сообщений из 6, страница 1 из 1
Поиск в строке
    #35316140
stoopper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Вопросик такой.
Есть длинная строка (ок. 50 000 000 символов).
Есть несколько коротких подстрок (по 5-6 символов). Подстроки уникальные.
Задача - найти все эти подстроки в строке, отсчитать от места вхождения по заданному количеству символов назад и запомнить полученную подстроку и вперед (тоже запомнить строку).
Пытаюсь at(), но такие тормоза...
...
Рейтинг: 0 / 0
Поиск в строке
    #35317180
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для одной подстроки поиска вота посмари. Ну и вперед и с песней на доработку
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
**	где ищем...
cString=[erg s;dvn ae;rufh ;alfkl';owe aerf has;dkfaeprog s;dhgs;dg aerf erituyeg ]
FOR nCnt=1 TO 18
	cString=cString+cString
ENDFOR
**	длина 19 136 512 символов
#DEFINE REPL_CHAR	"*"+CHR(13)	&& подразумеваем любой символ, кот аще нет в строке
cSearch=[aerf]	&& ч:Е ищем
cTxtFile='c:\temp.txt'
nPrevLen= 3 
nNextLen= 4 
***********************************

STRTOFILE(STRTRAN(cString, cSearch, REPL_CHAR), cTxtFile)	&& при  20  лямках - около  2 -х минут

CREATE CURSOR qTemp (note C( 254 ))
APPEND FROM (cTxtFile) DELIMITED && около секи 
GO TOP
**	в первой записе взять только схвоста минус символ REPL_CHAR+CHR( 13 )
?LEFT(RIGHT(RTRIM(note), nPrevLen+ 2 ),nPrevLen)
SCAN ALL
	**	у каждой последущей - с начала и конца по заданной длине
	?LEFT(LTRIM(note), nNextLen)
	?LEFT(RIGHT(RTRIM(note), nPrevLen+ 2 ),nPrevLen)
ENDSCAN
...
Рейтинг: 0 / 0
Поиск в строке
    #35317203
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавчик
астерикс перед CHR(13) введен для того, если в исходной строке символов уже есть где-нить CHR(13). Тогда при сканировании курсора нужно смареть на концевой символ, и если он *, то с нее и делать обрезания
...
Рейтинг: 0 / 0
Поиск в строке
    #35317328
stoopper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, будем пробовать
...
Рейтинг: 0 / 0
Поиск в строке
    #35317384
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При размере 50Мб я бы не советовал в лоб задачу решать.
Эти 50Мб изначально файл? Если не файл - то сохрани.
Дальше читай небольшими блоками, немного конца предыдущего к текущему в начало добавляй для непрерывности поиска и смещение считай. Примерно так (5-6 сек. на 122 Мб):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
lnSec = seconds()
lnF = fopen('C:\BACKUP\SQLBase.rar') && размер 122Мб
lcS = ''
lnPos =  0  && Реальная позиция первого байта буфера
lnBlok =  32768  && Размер считываемого блока за раз
lnOtstup =  1024  && Отступ назад для неразрывного поиска
lcFind = 'Rar' && Искомая строка
lnPrev =  0 
do while !feof(lnF)
	lcS = right(lcS, lnOtstup) + fread(lnF, lnBlok)
	for i =  1  to occurs(lcFind, lcS)
		lnFind = lnPos - iif(lnPos =  0 ,  0 , lnOtstup) + at(lcFind, lcS, i)
		if lnFind > lnPrev && Защита от повторов
			? 'Нашли подстроку:', lnFind
			lnPrev = lnFind
		endif
	endfor
	lnPos = lnPos + lnBlok
enddo
fclose(lnF)
? seconds() - lnSec 
...
Рейтинг: 0 / 0
Поиск в строке
    #35317520
stoopper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 DimaT

Изначально это файл. спасибо за вариант. Тоже попробую.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Поиск в строке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]