Поиск в txt файле и вывод строки с найденным совпадением

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

Re: Re:

Postby VoidVolker » Sat, 10 Sep 2011, 14:44

Aveiro wrote:
VoidVolker wrote:Примеры:
Code: Select all
#( Test-Read-BY-Line
NoActive
Action:
\ Выведет в сообщении все строчки файла test.txt
READ-BY-LINE: "D:\test.txt"
MsgBox
;READ-BY-LINE

S" D:\test.txt" READ-BY-LINE  \ Быстрее, т.к. строке не делается EVAL-SUBST (т.е. не работает %<...code...>%)
MsgBox
;READ-BY-LINE
\ Выведет в сообщении все строчки файла test.txt
READ-BY-LINE: "D:\test.txt"
MsgBox -1
;?READ-BY-LINE

S" D:\test.txt" READ-BY-LINE  \ Быстрее, т.к. строке не делается EVAL-SUBST (т.е. не работает %<...code...>%)
MsgBox -1
;?READ-BY-LINE


\ Выведет в сообщении первую строчку файла test.txt
READ-BY-LINE: "D:\test.txt"
MsgBox 0
;?READ-BY-LINE

S" D:\test.txt" READ-BY-LINE  \ Быстрее, т.к. строке не делается EVAL-SUBST (т.е. не работает %<...code...>%)
MsgBox 0
;?READ-BY-LINE
)#

Почему то с модульной версией string_manipulation примеры не работают.

Потому что это примеры от старой версии и надо было смотреть примеры к новой версии - оно там рядом.

Aveiro wrote:1. Вывести первое сообщение из файла

Code: Select all
READ-BY-LINE: "filename"
  FOUND-LINE MsgBox RBL-EXIT
;READ-BY-LINE

Aveiro wrote:
2. Вывести последнее сообщение из файла

Code: Select all
S" "
READ-BY-LINE: "filename"
  2DROP FOUND-LINE S" " S+
;READ-BY-LINE
MsgBox


Aveiro wrote:3. Вывести все сообщения

Code: Select all
READ-BY-LINE: "filename"
  FOUND-LINE MsgBox
;READ-BY-LINE


Aveiro wrote:4. По маске /текст/ вывести найденную строку.
5. Ну и работа с найденной строкой (вытащить из строки различные слова)

Внутри цикла можно использовать следующие слова:
FOUND-LINE \ ( -- a u ) \ Найденная строка.
RBL-EXIT \ ( -- ) \ Выйти из цикла. Выход будет произведен в начале следующей итерации.
Соответственно можно с найденной строкой делать любые действия точно так же как с обычными строками в ннкроне.
Справка > Дополнительная информация > "Неотложная помощь" по Форту > 6. Какие типы строк используются в SP-Forth?
И далее по тексту.

Aveiro wrote:Еще вопрос родился....
FOUND-LINE может искать строку по маске ?

Это слово не ищет строку, а только кладет её на стек. Для поиска строк необходимо использовать слово SEARCH.
Aveiro wrote:Есть текст,где:
Code: Select all
 Иванов-5.06;
 Иванов-7.07;
 Иванов-12.11;

Нужно найти все строчки Иванов,причем цифры могут быть любыми.

Code: Select all
READ-BY-LINE: "filename"
  FOUND-LINE S" Иванов" SEARCH
  IF
    FOUND-LINE MsgBox
  THEN
  2DROP
;READ-BY-LINE

Так же рекомендую изучить синтаксис регулярных выражений, т.к. они предоставляют намного более широкие возможности по обработке текста, чем простой поиск и сравнение.
Code: Select all
READ-BY-LINE: "filename"
  FOUND-LINE S" /.*Иванов.*/" RE-MATCH
  IF
    \ ... выполняем работу
    FOUND-LINE MsgBox
  THEN
;READ-BY-LINE

Code: Select all
S" filename" FILE S" /(.*)(Иванов)(.*)/" RE-ALL
  IF
    \ ... выполняем работу
    $2 MsgBox
  THEN
;RE-ALL
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby Aveiro » Sat, 10 Sep 2011, 15:40

Спасибо VoidVolker .Я очень ждал сообщение от Вас в этой теме.
Работа со строками "мозоль"....
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby VoidVolker » Sat, 10 Sep 2011, 16:47

На здоровье.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby Aveiro » Sun, 11 Sep 2011, 17:02

Опробовал выводить все строки-работает хорошо.
Есть одна программа,которая пишет свои действия в лог.
Когда она запускается,появляется первое сообщение о ее запуске.Задача мониторит файл,и при появлении записи копирует эту запись в буфер обмена, далее текст из буфера отправляется в виде SMS на телефон.
Копирование делаю так:
Code: Select all
READ-BY-LINE: "Program.Log"
    FOUND-LINE CLIPBOARD: "%1 esPICKS%" RBL-EXIT
;READ-BY-LINE
 TMSG: "%CLIPBOARD%" 5

Работает нормально.
Иногда программа после запуска пишет некоторые сообщения в этот-же файл,файл мониторится,и при появлении записи нужно проделать сного копирование Но уже последней строки в буфер и затем отсылку...
делаю так:
Code: Select all
 S" "
 READ-BY-LINE: "Program.Log"
      2DROP FOUND-LINE
 ;READ-BY-LINE
 S" %1 esPICKS%" CLIPBOARD!
 MSG: "%CLIPBOARD%"

увы , делаю не правильно...с ошибкой. :(
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby VoidVolker » Mon, 12 Sep 2011, 18:43

Пардон, забыл про освобождение памяти в конце цикла. Вот так сработает:
Code: Select all
S" "
READ-BY-LINE: "filename"
  2DROP FOUND-LINE S" " S+
;READ-BY-LINE
MsgBox

* Не для задач, непрерывно работающих в течении долгого времени, т.к. возникнет утечка памяти. В таком случае, необходимо выделить буфер и в него сохранять строку в каждой итерации.
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby Aveiro » Mon, 03 Oct 2011, 19:18

LДа,хреновый из меня танцор....часа три пытаюсь разными вариантами решить задачу,но никак. :oops:
Нужно вывести значения из текстового файла ,строку нахожу,но никак не могу понять как с ней работать....поменялся формат,значения между кавычек.Эти значения затем пишутся в переменные.Формат такой :
Code: Select all
Иванов-10.11;3;12200
Петров-10.11;-5;6800
Сидоров-10.11;-7;5400

То,что между кавычек нужно вывести...
Например :
Code: Select all
Иванов 3

Честно говоря не пойму,как работают с текстом,считают положение цифры или все-таки по маске ?
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby elos » Mon, 03 Oct 2011, 21:29

Есть такой дядечка Wil Baden и его charscan, только вот не смотрел под какой это стандарт написано, но упоминается Standard Forth by Wil Baden.
Ещё в помощь:
Code: Select all
\ 11-07-2004 ~mOleg
\ Copyright [C] 2006-2007 mOleg mininoleg@yahoo.com
\ разбор строк с различного вида разделителями
\ в том числе, когда разделители должны исполняться

 REQUIRE ?DEFINED devel\~moleg\lib\util\ifdef.f

\ взять из строки число в шестнадцатиричном виде
: HCHAR ( addr # -> CHAR ) 0 0 2SWAP >NUMBER IF THROW THEN 2DROP ;

\ сохранить список разделителей на HERE вернуть длинну
: +delimiters ( addr --> # )
              BASE @ >R HEX
              >R
              BEGIN PeekChar 0x0A <> WHILE
                    NextWord DUP WHILE
                    HCHAR R@ + -1 SWAP C!
               REPEAT 2DROP
              THEN
              RDROP
              R> BASE ! ;

\ создать список разделителей
\ разделители пишутся в 16 виде, могут находиться только на одной строке
: Delimiter: ( | xC xC xC EOL --> )
             CREATE HERE DUP 256 DUP ALLOT ERASE +delimiters
             ( --> addr )
             DOES> ;

: xWord ( delim --> ASC # )
        CharAddr >R
        BEGIN GetChar WHILE
              OVER + C@ 0= WHILE
              >IN 1+!
          REPEAT DUP
        THEN 2DROP
        R> CharAddr OVER - ;

?DEFINED test{ \EOF -- тестовая секция ---------------------------------------

test{ \ пока просто тест на подключаемость.
  S" passed" TYPE
}test

\EOF

Delimiter: proba 3A 3B 5B 5D

: test BEGIN proba xWord DUP WHILE
             CR ." лексема: " TYPE
                8 SPACES ." разделитель: "
                PeekChar EMIT
                >IN 1+!
       REPEAT 2DROP CR ;

test as[asdasd]dasdv;vkjjl:vlkj;l
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby Aveiro » Tue, 04 Oct 2011, 13:22

Спасибо elos .
А как этим пользоваться ? Я просто пользователь,у меня сейчас встала задача взять из текст.файла данные между кавычек,если это бы получилось далее стал бы реализовывать задачу. Короче пользовательский уровень,не более.В форте не силен,пока банальная нехватка времени.
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby elos » Tue, 04 Oct 2011, 21:54

Как говорил доктор Быков "А чёй то" я?..

Code: Select all
SET logfile_name=C:\tmp\test_regexp.txt
SET parselog=C:\tmp\test_regexp.log
SET regtest1=/^(\w+)-\d+\.\d+\;(.+)\;/

#( log_regexp_parse
\ NoActive
AsLoggedUser
Action:

READ-BY-LINE: "%logfile_name%"
  RE-MATCH: "%FOUND-LINE%" "%regtest1%"
    IF \ совпало!
      LOG: "%parselog%" "%$1%  %$2%"
    THEN
;READ-BY-LINE

)#
Проверял в RegexBuddy. Тест List All Matches with Full Details выдаёт
Code: Select all
.................................Start...Length.......
Match 1:   Иванов-10.11;3;           0       15
Group 1:   Иванов                    0        6
Group 2:   3                        13        1
Match 2:   Петров-10.11;-5;         22       16
Group 1:   Петров                   22        6
Group 2:   -5                       35        2
Match 3:   Сидоров-10.11;-7;        44       17
Group 1:   Сидоров                  44        7
Group 2:   -7                       58        2

Сам не проверял, но переделал рабочий пример - должно работать.

До кучи - Free Regular Expression Designer.
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby elos » Wed, 05 Oct 2011, 08:21

Попробовал сейчас на работе, добавив проверку на отсутствие совпадений в виде писка... Или машину надо перегрузить (давно стоит), или...

Имеем на выходе
ванов 3
ров -5
идоров -7
И то только со строчкой, где убран признак начала строки
Code: Select all
  RE-MATCH: "%FOUND-LINE%" "/(\w+)-\d+\.\d+\;(.+)\;/"
Чёй то разное количество символов отгрызает, ну, да сам разберёшься - не всё ж нам пироги грызть...
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby elos » Wed, 05 Oct 2011, 10:53

Зато взяв для разбора текст
Smit-10.11;3;12200
Potter-10.11;-5;6800
Guitar-10.11;-7;5400

Иванов-10.11;3;12200
Петров-10.11;-5;6800
Сидоров-10.11;-7;5400
имеем
Code: Select all
Smit  3
Potter  -5
Guitar  -7
ванов  3
ров  -5
идоров  -7

С английским у нас всё в порядке. Но тут уж проблемы regexp.dll. Мной пока до этого было замечено, что русский текст она разбирает только при точном соответствии регистра букв даже при заданном ключе i. Обходил переводом русского текста в один регистр, например, нижний (плагин recode.spf).

Теперь результаты проб до кучи:
Code: Select all
_______________
приводим русский к ВЕРХНЕМУ регистру
_______________
Smit  3
Potter  -5
Guitar  -7

_______________
приводим русский к нижнему регистру
_______________
Smit  3
Potter  -5
Guitar  -7
иванов  3
ров  -5
сидоров  -7

_______________
добавляем в регэксп ^
_______________
Smit  3
Potter  -5
Guitar  -7
иванов  3
сидоров  -7

_______________
оставляем только нижний русский
_______________
иванов  3
сидоров  -7

Что-то не нравится петров парсеру... хохлова проигнорировал, аносова заметил.

Странно. Теперь я вопрос задам - что бы это было и что я делаю неправильно?
elos
 
Posts: 664
Joined: Tue, 25 Apr 2006, 11:15

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby Aveiro » Wed, 05 Oct 2011, 15:10

Еще раз спасибо за помощь.
Задача по моему очень практически полезна,поскольку можно заменить Excell на автоматический подсчет данных использовав nnCron.
Только вот затык был в том,что цифр в строке несколько... был-бы универсальный вариант,например брать вторую,либо третью,либо пятую цифру и т.п,далее работать с ними.Тогда автоматическая обработка ,без открытия документа, весьма полезная вещь.
На данный момент остановился на таком решении, использовав пример от VoidVolker, за что ему отдельное спасибо.
Здесь берутся данные для Иванова между кавычек и они складываются ,заносятся в переменную.
Code: Select all
#( Данные_Иванова
NoActive
VARIABLE Иванов
Action:
    0 Иванов !
    READ-BY-LINE: "D:1.txt"
        FOUND-LINE S" Иванов" SEARCH
        IF
            FOUND-LINE S" ;" S" ;" GET-SUBST S>NUM Иванов +!
      THEN
        2DROP
    ;READ-BY-LINE
TMSG: "Иванов = %Иванов @%" 30
)#
nncron.exe v 1.93b15 Build 1177 08.02.2016
tm.exe v 1.93b15 Build 604 08.02.2016
Aveiro
 
Posts: 222
Joined: Tue, 06 Jul 2010, 21:19

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby spronkin » Sat, 28 Apr 2012, 19:08

Может, вопрос конечно не по теме, но как организовать следующий цикл?:
Code: Select all
Считать 1-ю строку в буфер
вставить из буфера в текстовое поле
Считать 2-ю строку в буфер
вставить из буфера в текстовое поле
...
и так до конца файла


Понимаю, что нужно использовать READ-BY-LINE и переменную "%CLIPBOARD%", но как именно, ума не приложу.
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby VoidVolker » Sat, 28 Apr 2012, 22:18

Code: Select all
READ-BY-LINE: "filename"
  FOUND-LINE CLIPBOARD!  \ Вставляем текст в буфер обмена
  \ Далее вставляем текст - выбирая один из вариантов(т.к. не всегда и не все могут сработать, зависит от ПО):
  SEND-KEYS: "^V"   
  \ либо
  SEND-KEYS: "+{0x2D}"
  \ либо
  162 specKeyDN 86 specKeyDN 86 specKeyUP 162 specKeyDN
  \ либо с плагином sendinput
 162 AKEYDN 86 AKEY 162 AKEYUP
  \ либо с плагином sendinput второй вариант
  Shift( Insert )Shift
  \ Чтобы винда успела понять, что это только что было
 100 PAUSE
;READ-BY-LINE
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Поиск в txt файле и вывод строки с найденным совпадением

Postby spronkin » Sun, 29 Apr 2012, 21:11

Code: Select all
Action:
    READ-BY-LINE: "c:\nncron\ip.txt"
        START-APP: notepad.exe
        PAUSE: 2000
        FOUND-LINE CLIPBOARD!
        PAUSE: 2000
        162 AKEYDN 86 AKEY 162 AKEYUP
        PAUSE: 2000
        SEND-KEYS: "{ENTER}{ENTER}"
    ;READ-BY-LINE

Спасибо, вставка происходит, но как-то странно. Сначала ничего не печатает, а секунд через пять выплевывает сразу все, что накопировал. Можно ли заставить READ-BY-LINE работать как цикл с 1 по END_OF_LINE, чтобы в каждой итерации в CLIPBOARD помещалась только текущая строка и позволялись бы иные операции в цикле? Я рассчитывал, что каждая строка, помещенная в notepad будет разделена двойным ETNER, а тут вставляются все строки сразу и только потом ENTER.
User avatar
spronkin
 
Posts: 86
Joined: Sun, 15 Jan 2012, 13:56

PreviousNext

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: Bing [Bot] and 1 guest

cron