Меню Закрыть

Vfoxpro поиск совпадений в тексте

Содержание

BOF([nWorkArea | cTableAlias])

возвращает .T., если выполнена попытка установить файловый указатель перед первой записью таблицы, или .F. – в противном случае.

Установить файловый указатель в начало таблицы может, например, команда SKIP, выполняемая с отрицательным параметром.

Пример. Выводятся фамилии авторов, занесенные в записи 10, 9, …, 1 таблицы .

open database d:HomeLibraryHomeLibrary.dbc

do while not Bof( )

skip -1 && Переход на предыдущую запись

EOF([nWorkArea | cTableAlias])

возвращает .T., если выполнена попытка установить файловый указатель вслед за последней записью таблицы, или .F. – в противном случае. В частности, EOF( ) вернет .T., если поиск командами FIND, LOCATE или SEEK оказался нерезультативным.

Функция вернет .F., если в области таблица не открыта, и сгенерирует ошибку, если указан неиспользуемый псевдоним cTableAlias.

Пример. Перебираются все записи таблицы Authors.

open database d:HomeLibraryHomeLibrary.dbc

do while not Eof( )

skip 1 && Переход на следующую запись

LOOKUP(ReturnField, eSearchExpression, SearchedField [, cTagName])

ищет первую запись таблицы, значение поля SearchedField которой отвечает заданному выражению eSearchExpression. Возвращает, если запись найдена, значение, имеющееся в поле ReturnField, или пустую строку, длина которой равна длине поля ReturnField. Тип результата совпадает с типом поля ReturnField.

Если поиск удачен, то LOOKUP( ) перемещает таблицу на найденную запись. Если неудачен, то таблица позиционируется в конце файла, где EOF( ) возвращает .T.

Если LOOKUP( ) применяется для поиска в родительской таблице, то файловые указатели дочерних таблиц в результате поиска перемещаются на соответствующие записи.

Функция не использует рашмор-оптимизацию.

ReturnField – поле, значение которого в случае успешного поиска возвращает функция LOOKUP( ).

eSearchExpression – искомое значение. Обычно – это значение, которое может хранить поле SearchedField. Также выражение может соответствовать индексному выражению активного индекса или активного тега составного индекса.

SearchedField – поле, в котором ищется eSearchExpression. Если таблица не имеет активного индекса и если опущен параметр cTagName, то функция LOOKUP( ) выполняет последовательный поиск.

Если имеется активный индекс или тег, индексное выражение которого – это SearchedField, то LOOKUP( ) использует этот индекс или тег (выполняет бинарный поиск) ускоряя тем самым получение результата.

Читайте также:  Unifi ap ac pro подключение

cTagName – имя тега составного индекса, используя который LOOKUP( ) осуществляет бинарный поиск.

Замечание . Если поиск выполняется не в текущей таблице, поля ReturnField и SearchedField должны предваряться псевдонимом таблицы-объекте поиска..

Пример 1. Возвращается значение поля InputDate таблицы Authors для записи, имеющей Author >

open database d:HomeLibraryHomeLibrary.dbc

inDate = Lookup(Authors.InputDate, 14, Authors.AuthorId, "AuthorId")

? inDate && Напечатает: 11.21.2004

&& Напечатает фамилию автора, хранимую в найденной записи

Пример 2. Выводятся названия книг, написанных автором с Author >

open database d:HomeLibraryHomeLibrary.dbc

use Authors in 0

use BooksAuthors order tag AuthorId in 0

if Seek(auIdSearched) then

do while BooksAuthors.Author >

? Lookup(Books.Book, BooksAuthors.BookId, Books.BookId, "BookId")

skip && Переход к следующей записи

auName = Lookup(Authors.Author, auIdSearched, Authors.AuthorId, "AuthorId")

if not Empty(auName) then

MessageBox("В библиотеке нет книг автора " + Rtrim(auName))

MessageBox("Нет автора с кодом " + Transform(auIdSearched))

FOUND([nWorkArea | cTableAlias])

возвращает .T., если команда CONTINUE, LOCATE или SEEK выполнена результативно, или .F. – в противном случае. Функция оперирует либо текущей, либо указанной параметром nWorkArea | cTableAlias таблицей.

Пример см. в описании команды LOCATE.

SEEK(eExpression [, nWorkArea | cTableAlias
[, nIndexNumber | cIDXIndexFileName | cTagName]])

возвращает .T., если в индексированной таблице найдена запись, значение индексного выражения которой отвечает eExpression, или .F. – в противном случае.

Файл позиционируется на найденной записи, если она найдена, либо в конце файла – в противном случае.

На результаты поиска влияет установка команды SET EXACT: совпадение должно быть полным, если SET EXACT установлен в ON.

Функция эквивалента применению команды SEEK с последующим вызовом функции FOUND( ).

eExpression – искомое значение индексного ключа.

nIndexNumber – позиция в списке открытых индексных IDX-файлов и CDX-файлов, по которой выбирается индекс или тег. Порядок нумерации индексов и тегов см. в описании команды SET ORDER.

Читайте также:  Дрова вайфай для ноутбука

cIDXIndexFileName – имя IDX-файла, в котором ищется eExpression.

cTagName – имя тега, в котором ищется eExpression.

Если имеются совпадающие имена IDX-файла и тега, то приоритет имеет IDX-файл.

Если параметр nIndexNumber | cIDXIndexFileName | cTagNamee опущен, то берется управляющий индекс. Если его нет, то VFP генерирует ошибку.

Если параметр nIndexNumber | cIDXIndexFileName | cTagNamee имеется, то берется индекс (тег), определяемый этим параметром.

Пример. Печатаются фамилии всех авторов, начинающиеся с буквы Л, таблицы Authors, открытой с управляющим тегом Author.

open database d:HomeLibraryHomeLibrary.dbc

use Authors order tag Author

if Seek(fistLetter) then

&& Перемещаемся по записям, поле Author которых начинается с буквы Л

do while Authors.Author = fistLetter and not Eof( )

MessageBox(‘Нет авторов с фамилией, начинающейся с буквы ‘ + fistLetter)

INDEXSEEK(eExpression [, lMovePointer [, nWorkArea | cTableAlias
[, nIndexNumber | cIDXIndexFileName | cTagName]]])

ищет в индексированной таблице первую запись, значение ключа которой отвечает заданному выражению eExpression. Возвращает .T., если запись найдена, или .F. – в противном случае.

Поиск может выполняться как с перемещением, так и без перемещения файла. Поиск производится в индексном файле или теге текущей или заданной таблицы. Если необязательные параметры отсутствуют, то берется управляющий индексный файл или тег. Если такового нет, то VFP генерирует ошибку.

Функция вернет .F., если выполняется попытка найти значение ключа последней добавленной командой INSERT INTO или APPEND BLANK записи и если файл все еще остается на этой записи.

На результаты поиска влияет установка команды SET EXACT.

Параметр (см. также описание функции SEEK( )):

eExpression – искомое значение индексного выражения.

lMovePointer – перемещает файл на найденную запись или конец файла при неудаче, если lMovePointer = .T., и не перемещает – в противном случае.

Может быть употреблен следующий вариант использования INDEXSEEK( ): первоначально поиск ведется с lMovePointer = .F., и если функция вернет .T., то для перемещения к найденной записи выполняется поиск с lMovePointer = .T.

open database d:HomeLibraryHomeLibrary.dbc

Читайте также:  Выставки на зиповской 5

use Authors order tag Author

&& Полного совпадения не требуется

? IndexSeek(‘Л’, .F.) && Напечатает: .T.

&& Позиция файла не меняется

? IndexSeek(‘Л’, .T.) && Напечатает: .T.

&& Файл позиционируется на найденной записи

KEYMATCH(eExpression [, nIndexNumber [, nWorkArea | cTableAlias]])

возвращает .T., если индексный ключ eExpression найден, или .F. – в противном случае.

Поиск осуществляется в индексном файле или теге текущей или заданной таблицы. Если необязательные параметры отсутствуют, то берется управляющий индексный файл или тег. Если такового нет, то VFP генерирует ошибку. На результаты поиска влияет установка команды SET EXACT. Позиция файла после выполнения поиска не меняется.

Параметры см. в описании функции SEEK( ).

open database d:HomeLibraryHomeLibrary.dbc

use Authors order tag Author

? KeyMatch(‘Л’) && Напечатает: .T.

&& Позиция файла не меняется

&& Употребляем функцию SEEK( )

&& Файл позиционируется на найденной записи

Есть таблица в базе. Там, примерно, сотня записей. Может быть и больше, значительно больше. Таблица районов города, чтобы имели представление.
Есть текстовое объявление типа "куплю дом ил квартиру" и т.д. Нужно определить в тексте объявления район города.
Пытался строить регулярные выражения по списку районов: (район1|район2|район3|районN) но регулярка получается на столько огромной, что парсер просто не справляется и программа виснет.

Какие могут быть оптимальные обходные пути?

Всем привет, подскажите пожалуйста кто сталкивался с подобным, как реализовать поиск игр в тексте. К примеру есть база с названиями игр, база постепенно расширяется и становиться все масштабнее, надо при добавлении новости — статьи на сайт анализировать текст и проверять есть ли игры из базы, и если есть то загнать в нужную таблицу например айдишник этой игры.

Не могу понять как можно максимально оптимизировано подобное реализовать, неужели перед сохранением теста в базу, нужно пройтись регулярками по тексту на поиск совпадений из списка игр? А если игр скажем тысяч 10? Какподобное можно реализовать, подскажите куда капать. спасибо!

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.