Разбор строк на отдельные слова

Обсуждение программ nnCron и nnCron LITE

Разбор строк на отдельные слова

Postby Questguest » Mon, 18 Feb 2019, 22:36

Хочу научить крон предпринимать действия, если записанный в логах других программ определенный параметр оказывается вне нужного диапазона.
Как читать файлы понятно, об этом и в справке достаточно написано, и на форуме. Но как разбирать строки на нужные параметры?
Регекспы вида /^(.*?)\s+(.*?)\s+(.*?)$/ сильно нагружают проц, хотя в принципе работают.

Вот такая задачка:
Code: Select all
S" Некая строка со словами, пробелами или табуляциями, или вовсе таблица, и нужный параметр это определенное слово отсюда" 13 GetWord

Как определить GetWord, чтобы на стеке появились начало и конец 13-го по счету слова ("параметр"), т.е. числа 80 и 88?
Или это слово в виде au-строки?

А если логи в формате html, то хотелось бы научиться получать из z-строки содержимое между открывающими и закрывающими тегами, начиная с какой-то позиции. Кто-то наверняка читал html кроном, но как это сделать, поменьше нагружая цп? :roll:
Questguest
 
Posts: 3
Joined: Mon, 18 Feb 2019, 21:50

Re: Разбор строк на отдельные слова

Postby VoidVolker » Tue, 19 Feb 2019, 11:57

viewtopic.php?f=23&t=9477#p21479
Там куча слов для работы со строками типа GET-SUBST. Кроме того, есть еще слово SEARCH для поиска текста в строке.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2938
Joined: Tue, 25 Apr 2006, 17:56

Re: Разбор строк на отдельные слова

Postby Questguest » Tue, 19 Feb 2019, 12:57

Сделал так:
Code: Select all
VARIABLE Words
: GET-WORDS
RE-ALL: " Строка с нужными параметрами или с таблицей" "/(.+?)\s+|$/"
$1 S>ZALLOC Words AppendNode
;RE-ALL
;
: Get-Word-4 Words @ @ @ @ NodeValue ASCIIZ> ;
: Get-Word-7 Words @ @ @ @ @ @ @ NodeValue ASCIIZ> ;
: WORDS-OFF
[NONAME NodeValue FREE DROP NONAME] Words DoList
Words FreeList
;
: main
GET-WORDS
Get-Word-4 MsgBox
Get-Word-7 MsgBox
WORDS-OFF
;

Работает, только надо изобретать слова для каждой позиции в списке. А можно ли как-то попроще и правильнее извлечь из списка n-ное по счету значение?
Questguest
 
Posts: 3
Joined: Mon, 18 Feb 2019, 21:50

Re: Разбор строк на отдельные слова

Postby VoidVolker » Tue, 19 Feb 2019, 21:21

Чем GET-SUBST не устраивает?
Code: Select all
S" Некая строка со словами, пробелами или табуляциями, или вовсе таблица, и нужный параметр это определенное слово отсюда" S" параметр " S"  слово" GET-SUBST TYPE CR
это определенное
 Ok

Questguest wrote:А можно ли как-то попроще и правильнее извлечь из списка n-ное по счету значение?

Да, можно, вот этот плагин: viewtopic.php?f=5&t=11161
Code: Select all
: StringSplit   { a u a1 u1 -- a2 u2 a3 u3 TRUE | a u a1 u1 FALSE }
    a u a1 u1 SEARCH IF
        OVER a - a SWAP   \ a4 u4 a2 u2
        2SWAP       \ a2 u2 a4 u4
        u1 - SWAP u1 + SWAP \  a2 u2 a3 u3
        TRUE
    ELSE
        2DROP
        a u a1 u1
        FALSE
    THEN
;

: StrWords2List { \ list -- list } \ ( a u -- list )
    STRING-LIST TO list \ Создаем список
    BEGIN S"  " StringSplit WHILE  \ Делим строку по первому пробелу
        2SWAP list LIST! \ Сохраняем слово в список
    REPEAT
    2DROP 2DROP \ Строка не найдена — выкидываем все (пробел, в данном случае)
    list \ Оставляем на стеке список
;


Пример:
Code: Select all
S" Некая строка со словами, пробелами или табуляциями, или вовсе таблица, и нужный параметр это определенное слово отсюда" StrWords2List 13 OVER LIST#@ TYPE CR LIST-FREE
это
 Ok
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2938
Joined: Tue, 25 Apr 2006, 17:56

Re: Разбор строк на отдельные слова

Postby Questguest » Mon, 25 Feb 2019, 01:00

VoidVolker wrote:Чем GET-SUBST не устраивает?

Устраивает, почему же нет? Словечки интересные и полезные, спасибо.
Но я имел в виду что-нибудь в этом роде:
Code: Select all
VARIABLE Words
VARIABLE WordCnt
VARIABLE WordNum
: GET-WORDS RE-ALL: " Строка с нужными параметрами или с таблицей" "/(.+?)\s+|$/"
$1 S>ZALLOC Words AppendNode
;RE-ALL
;
: GET-WORD WordNum ! WordCnt OFF [NONAME WordCnt 1+! WordCnt @ WordNum @ = IF ELSE DROP THEN NONAME] Words DoList NodeValue ASCIIZ> ;
: WORDS-OFF [NONAME NodeValue FREE DROP NONAME] Words DoList Words FreeList ;
: main
GET-WORDS
4 GET-WORD MsgBox
WORDS-OFF
;

Вдруг там слов много, а нужное - 678-е... А я правильно понимаю, что локальные переменные GET-WORD в NONAME использовать не получится?
Хорошо бы такие слова и те из плагинов были в хелпе крона. А то приходится велосипеды изобретать :)
Questguest
 
Posts: 3
Joined: Mon, 18 Feb 2019, 21:50

Re: Разбор строк на отдельные слова

Postby VoidVolker » Mon, 25 Feb 2019, 23:09

Questguest wrote:А я правильно понимаю, что локальные переменные GET-WORD в NONAME использовать не получится?

Что? Именно локальные переменные, объявляемые фигурными скобками нельзя, т.к. [NONAME создает еще одно слово внутри слова и в нем меняется стэк возвратов, который используется локальными переменными. Или что-то другое имеете ввиду?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2938
Joined: Tue, 25 Apr 2006, 17:56


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 2 guests