Строки из текстового файла в переменные

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

Строки из текстового файла в переменные

Postby sournk » Mon, 09 Aug 2010, 14:25

Как прочитать 3 строки под нужными номерами (например, 2, 5 и 6) из текстового файла и сохранить их в 3 переменные?
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31


Re: Строки из текстового файла в переменные

Postby sournk » Tue, 10 Aug 2010, 06:47

А можно привести пример использования FILE-NUM-LINE и FILE-READ-LINE-N. Никак не пойму как их вызвать и обработать результат.
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby sournk » Tue, 10 Aug 2010, 12:08

Пробовал вывести 2ую строку через msg так:
Code: Select all
   2 S" c:\test.txt" FILE-READ-LINE-N
        MSG: "%1 esPICKS%"

выдает internal error
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby SeMa » Tue, 10 Aug 2010, 13:02

sournk wrote:А можно привести пример использования FILE-NUM-LINE и FILE-READ-LINE-N.

S" абракадабра" FILE-NUM-LINE −> на стеке − кол-во строк в файле "абракадабра"
S" абракадабра" 15 FILE-READ-LINE-N −> на стеке − адрес 15-й строки файла "абракадабра".
Есть небольшое неудобство − файл читается 2 раза:
1-й − для подсчета кол-ва строк;
2-й − для нахождения нужной строки.
На больших файлах возможна задержка (на медленных машинах).

elos wrote:Соединить READ-BY-LINE с CASE

Здесь поднимался подобный вопрос. В примере VoidVolker'a в блоке <.....> \ Обрабатываем строку (в первом примере выбросить cnt . CR \ Печатаем счетчик) вначале вставить CASE с нужными номерами строк:
Code: Select all
CASE
    2 OF text_var_1 PLACE ENDOF
    5 OF text_var_2 PLACE ENDOF
    6 OF text_var_3 PLACE ENDOF
ENDCASE


sournk wrote:выдает internal error

1. Перепутаны данные на стеке:
Code: Select all
: FILE-READ-LINE-N ( a1 u1 n -- a2 u2 )
надо S" c:\test.txt" 2 FILE-READ-LINE-N.

2. MSG: "%1 esPICKS%".
проще S" c:\test.txt" 2 FILE-READ-LINE-N MsgBox
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Строки из текстового файла в переменные

Postby sournk » Tue, 10 Aug 2010, 13:34

Все равно не получается у меня. Вот такой мой таск:
#( test_read
NoActive
: FILE-NUM-LINE ( a u -- n )
\ возвращает количество строк n в файле a u
0 ROT ROT
READ-BY-LINE
ROT 1 +
NIP NIP
;READ-BY-LINE ;
Action:
S" c:\Temp\09\kat\daemon.kat" FILE-NUM-LINE MsgBox
)#

При запуске происходит ошибка:
test_read: Internal error. Error # -1073741819. Куда рыть?
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby elos » Tue, 10 Aug 2010, 13:46

Файл C:\flag_1.txt
string1
string2
string3
string4
string5
string6
string7
string8
string9
Для новой версии плагина:
Code: Select all
#( test_read_n_string
NoActive
AsLoggedUser
VARIABLE my_var \ уже нуль задан
Action:
READ-BY-LINE: "C:\flag_1.txt"
my_var 1+!
my_var @
CASE
    \ строка 3
    3 OF FOUND-LINE MsgBox ENDOF
    \ строка 5
    5 OF FOUND-LINE MsgBox ENDOF
    \ строка 7
    7 OF FOUND-LINE MsgBox ENDOF
    \ остальные строки
    DUP OF  ENDOF
ENDCASE
;READ-BY-LINE
)#


Что-то не удалось мне вставить в задачу FILE-READ-LINE-N - всё ошибки сыпятся (где-то недосматриваю). НО выяснилось, что при просмотре примеров надо различать версии плагина с READ-BY-LINE. В старой версии внутри цикла мы имели адрес и длину строки. В новой же версии этого нет - данные для строки получаем через FOUND-LINE. Кому как, а меня это путало, так как думал, что просто появилось новое слово для повторного использования, да архитектурно переписано...
Для старой версии плагина имеем:
Code: Select all
\ Выведет в сообщении все строчки файла test.txt
READ-BY-LINE: "D:\test.txt"
MsgBox
;READ-BY-LINE

Для новой версии плагина:
Code: Select all
\ Выведет в сообщении все строчки файла test.txt
READ-BY-LINE: "D:\test.txt"
FOUND-LINE MsgBox
;READ-BY-LINE
Last edited by elos on Tue, 10 Aug 2010, 14:54, edited 1 time in total.
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: Строки из текстового файла в переменные

Postby sournk » Tue, 10 Aug 2010, 14:10

Вот и у меня с любой версией READ-BY-LINE не хотят работать ни FILE-NUM-LINE, ни FILE-READ-LINE-N
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby SeMa » Tue, 10 Aug 2010, 14:39

elos, sournk, примеры не проверял, версии плагина не сравнивал...

sournk
: FILE-NUM-LINE ( a u -- n ) − другой случай и
S" c:\Temp\09\kat\daemon.kat" FILE-NUM-LINE MsgBox − неверно!
Слово FILE-NUM-LINE возвращает число, а MSG: и, MsgBox обрабатывают строки.
надо S" c:\Temp\09\kat\daemon.kat" FILE-NUM-LINE N>S MsgBox.

У меня есть старая задача с использованием номеров строк (для которой я и хотел измененный READ-BY-LINE, но так задачу и не доделал), основанная на примере test_read_by_line1 из "неотложной помощи" из хелпа.
Я добавил VARIABLE ln_number1 и вставил ее обработку в код:
Code: Select all
    BEGIN list-contents max-line-size 2- list-file READ-LINE THROW WHILE
    \ На стеке осталось число прочитанных символов.
    \ Прибавляем его к адресу зарезервированной памяти
    \ и дописываем 0, чтобы получить zero-terminated string
    list-contents + 0 SWAP C!
\ == дальше мои строки ==
  ln_number1 1+! \ инкрементация счетчика строк
  ln_number1 @
  CASE
      1   OF     \ проверка 1-й строки файла на его готовность к обработке - //
...
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Строки из текстового файла в переменные

Postby sournk » Wed, 11 Aug 2010, 10:05

А как передать в конструкцию S" c:\Temp\09\kat\daemon.kat" 2 FILE-READ-LINE-N переменную %FOUND-FULLPATH%, если эти файлы получаю перебором из каталога.
Пробую сделать так:
Code: Select all
   
FOR-FILES: "c:\Temp\*.txt"
  IS-DIR?
  IF
  ELSE
    S" %FOUND-FULLPATH%" 1 FILE-READ-LINE-N  \ Тут естественно - файл не наден, т.к. %FOUND-FULLPATH% не преобразуется в путь к файлу, а просто остается строкой.
    MSG: "%1 esPICKS%"
  THEN
;FOR-FILES
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby elos » Wed, 11 Aug 2010, 10:24

sournk wrote:Вот и у меня с любой версией READ-BY-LINE не хотят работать ни FILE-NUM-LINE, ни FILE-READ-LINE-N
Уже заработало? Если да, то что сделал?
elos
 
Posts: 667
Joined: Tue, 25 Apr 2006, 11:15

Re: Строки из текстового файла в переменные

Postby sournk » Wed, 11 Aug 2010, 11:14

Все заработало как написано двумя постами выше. Работает как с новой версией READ-BY-LINE, так и со старой.
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby SeMa » Wed, 11 Aug 2010, 17:42

FOUND-FULLPATH 1 FILE-READ-LINE-N
sournk wrote:%FOUND-FULLPATH% не преобразуется в путь к файлу, а просто остается строкой.

читай справку http://www.nncron.ru/help/RU/add_info/f ... m#evaluate
и подпись VoidVolker'a
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Re: Строки из текстового файла в переменные

Postby sournk » Thu, 12 Aug 2010, 08:46

С переменными разобрался, спасибо.
Теперь еще одна проблема никак не решается.
Задача такая: нужно прочитать первые строки в файлах *.kat нужного каталога и создать файлы по пути из этой строки.

Code: Select all
   FOR-FILES: "c:\Temp\09\kat\*.kat"
      IS-DIR?
      IF
      ELSE
         FOUND-FULLPATH 1 FILE-READ-LINE-N
         FILE-WRITE: "%1 esPICKS%" "123" \ Тут проблема, т.к. %1 esPICKS% возвращает строку + перевод строки, поэтому FILE-WRITE не отрабатывает.
      THEN
   ;FOR-FILES


Как сделать Trim на %1 esPICKS%?
sournk
 
Posts: 22
Joined: Fri, 15 Jan 2010, 14:31

Re: Строки из текстового файла в переменные

Postby SeMa » Thu, 12 Aug 2010, 15:36

sournk wrote:Как сделать Trim на %1 esPICKS%?

Вариант 1. Выбросить из слова FILE-READ-LINE-N операцию crlf S+.
Вариант 2. Уменьшение счетчика длины строки на длину crlf:
Code: Select all
FOUND-FULLPATH 1 FILE-READ-LINE-N  2 -

Еще: зачем %1 esPICKS%?
Использовать постфиксный синтаксис:
Code: Select all
FOUND-FULLPATH 1 FILE-READ-LINE-N
S" 123" 2SWAP FWRITE
Last edited by SeMa on Thu, 12 Aug 2010, 16:43, edited 2 times in total.
Компьютер ─ устройство, разработанное для ускорения и автоматизации человеческих ошибок
User avatar
SeMa
 
Posts: 637
Joined: Fri, 15 Apr 2005, 12:49
Location: Украина

Next

Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 2 guests