Обработать файлы по разным маскам

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

Обработать файлы по разным маскам

Postby VKarpovich » Fri, 14 Sep 2012, 11:14

Доброго всем времени суток!
Нужна помощь всезнающего сообщества.
Подскажите можно ли и если можно, то каким образом в имени одной переменной использовать значение другой переменной?
Вот пример:
Code: Select all
#( var_IN_var
NoActive
VARIABLE _Otd
VARIABLE _59
VARIABLE _60
VARIABLE _61
Action:
  59 _Otd !
  BEGIN
     FOR-FILES: "с:\xxx\*o.0%_Otd @%"
       1 _59 @ + _59 !
     ;FOR-FILES
     1 _Otd @ + _Otd !
  _Otd @ 62 =
  UNTIL
)#

Только вместо имени переменной _59 в теле цикла мне нужно подставить значение переменной _Otd.
У меня не получается. Помогите.
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Значение переменной внутри переменной

Postby VoidVolker » Fri, 14 Sep 2012, 13:22

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

Re: Значение переменной внутри переменной

Postby VKarpovich » Fri, 14 Sep 2012, 13:51

VoidVolker wrote:Какова задача?


В принципе, своей задачей не хотелось беспокоить сообщество. Тем более, что самому интересно поковыряться.
Только к сожалению не все получается.
Ну в общем задача такая:
Имеется каталог, в котором куча файлов. Требуется подсчитать количество файлов соответствующих следующим маскам:
c*o.059, c*o.060, ... c*o.075
*.59, *.60, ... *.75
*inv.59, *inv.60, ... *inv.75
После подсчета вывести командой HINT или как-то по-другому, но все вместе.
Со временем могут понадобиться и другие маски.
В общем-то задача несложная. Просто хочется все это впихнуть в маленький цикл, а не писать абракадабру на несколько страниц.
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Значение переменной внутри переменной

Postby Morituruz » Fri, 14 Sep 2012, 14:46

Если вам не нравится несколько раз обходить файлы, то можно несколько раз проверять файл на соответствие маске через регулярные выражения (RE-MATCH в справке есть, как и описание диалекта регулярных выражения):
Code: Select all
#( var_IN_var
NoActive
VARIABLE _Otd
VARIABLE _59
VARIABLE _60
VARIABLE _61
Action:
0 _Otd !
0 _59 !
0 _60 !
0 _61 !
FOR-FILES: "с:\xxx\*"   \ для всех файлов в папке ххх
   FOUND-FILENAME S" /c.+o\.059/i" RE-MATCH  \ подходит ли найденный файл под регулярное выражение?
   IF
        _59 @ 1 + _59 !
   THEN
   FOUND-FILENAME S" /c.+o\.060/i" RE-MATCH  \ подходит ли найденный файл под регулярное выражение?
   IF
        _60 @ 1 + _60 !
   THEN
   \ и т.п.
;FOR-FILES
\ подсчёт окончен, можно выводить любым удобным способом
)#
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Обработать файлы по разным маскам

Postby VoidVolker » Fri, 14 Sep 2012, 19:20

Переименовал тему — для большего соответствия названия и содержимого.
Ага, так уже лучше. На самом деле делать на несколько страниц нет необходимости. По циклу на маску вполне нормально:
Code: Select all
#( Задача_200614092012
NoActive
SingleInstance
: FilesGetCount
  0 ROT ROT FOR_FILES 1+ ;FOR-FILES
;
Action:
S" с:\xxx\<any_mask1>" FilesGetCount
S" с:\xxx\<any_mask2>" FilesGetCount
S" с:\xxx\<any_mask3>" FilesGetCount
S>D <# #S 2DROP  S"  mask3: " HOLDS #S 2DROP S"  mask2: " HOLDS  #S S" mask1: " HOLDS #> HINT
)#


Code: Select all
any_variable @ 1 + any_variable !

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

Re: Обработать файлы по разным маскам

Postby VKarpovich » Mon, 17 Sep 2012, 08:44

Спасиба VoidVolker. Простите, но я не отношу себя к знатокам форта. А потому все, что написано в постфиксном исполнении для меня лучше снабжать коментариями.
Moriturus тоже спасибо.
У вас получилось лучше, чем у меня сейчас есть.
Осталось выбрать из двух вариантов.
Задача решена,но мой вопрос остался открытым.
Можно ли использовать значение одной переменной внутри имени другой переменной?
Если можно, то как?
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Обработать файлы по разным маскам

Postby VoidVolker » Mon, 17 Sep 2012, 09:00

VKarpovich wrote:Спасиба VoidVolker. Простите, но я не отношу себя к знатокам форта. А потому все, что написано в постфиксном исполнении для меня лучше снабжать коментариями.

Code: Select all
#( Задача_200614092012
NoActive
SingleInstance
: FilesGetCount   \ ( a u -- num ) \ Посчитать число файлов по указанной маске
  0 ROT ROT   \ Кладем на стек в третью позицию ноль - это счетчик, сверху остается строка с маской
  FOR_FILES   \ Цикл для файлов по маске ...
  1+   \ Увеличиваем счетчик на еденицу
   ;FOR-FILES  \ Конец цикла
;
Action:
S" с:\xxx\<any_mask1>" FilesGetCount
S" с:\xxx\<any_mask2>" FilesGetCount
S" с:\xxx\<any_mask3>" FilesGetCount
S>D <#   \ Начало преобразования числа в строку (с конца)
#S 2DROP  \ Кладем в строку третий результат
 S"  mask3: " HOLDS \ Строку
 #S 2DROP \ Второй результат
S"  mask2: " HOLDS  \ Строку
 #S   \ Первый результат
S" mask1: " HOLDS  \ Строку
#> \ Конец преобразования числа в строку, вернуть строку на стек
HINT  \ Выводим хинт с получившейся строкой
)#


VKarpovich wrote:Можно ли использовать значение одной переменной внутри имени другой переменной?

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

Re: Обработать файлы по разным маскам

Postby VKarpovich » Mon, 17 Sep 2012, 09:57

Привожу алгоритм (пример) того, что хотел бы знать как реализовать:
объявляем переменные _01, _02, _03, _04, _05 ... _10 (для удобства назову их _xx перменные).
объявляем переменную _temp
В теле задачи примерно следующее:
Для всех файлов c:\xxx\*.*
Вырезаем из имени найденного файла 2 последних символа и записываем значение в переменную _temp
Присваимваем переменной _xx (Которую в данный момент нужно описать как _%_temp%) значение переменной _temp
конец цикла для

В каталоге c:\xxx\ находятся файлы с расширениями типа ?yy, где yy принимает значения 01, 02 ... 10
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Обработать файлы по разным маскам

Postby VoidVolker » Mon, 17 Sep 2012, 13:21

Т.е., нужно записать в переменные _01, _02, _03, _04, _05 ... _10 последние два символа десяти файлов из c:\xxx\?
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Обработать файлы по разным маскам

Postby VKarpovich » Mon, 17 Sep 2012, 15:20

VoidVolker wrote:Т.е., нужно записать в переменные _01, _02, _03, _04, _05 ... _10 последние два символа десяти файлов из c:\xxx\?

Не в значения переменных, а в имена переменных.
Если брать мою задачу, то я хотел бы чтобы было примерно так:
У меня есть куча переменных (их количество определяется масками файлов для подсчета).
Переменные в своем обозначении имеют цифры от 59 до 75 (например _59, _60 ..., _59l, _60l, ... и т.д. и т.п.)

Тогда в первом цикле (BEGIN...UNTIL) я пробегаюсь по числовому ряду от 59 до 75
А во втором цикле, находящемся внутри первого (FOR-FILES ... ;FOR-FILES) я пробегаюсь по всем файлам *.*, вырезаю из них 2 последних символа и наращиваю соответствующую переменную - ту, которая содержит в своем обозначении этих же два символа.
Только я не знаю как в имя переменной подставить значение этих двух символов.
Преимущества такого алгоритма в том, что, при добавлении новых масок файла я просто добавляю переменные.
А может я сильно заморачиваюсь?
Вот что у меня есть:
Code: Select all
#( files

VARIABLE _tmp
VARIABLE _59 VARIABLE _60 VARIABLE _61 VARIABLE _62
VARIABLE _63 VARIABLE _64 VARIABLE _65 VARIABLE _66
VARIABLE _67 VARIABLE _68 VARIABLE _69 VARIABLE _70
VARIABLE _71 VARIABLE _72 VARIABLE _73 VARIABLE _74
VARIABLE _75

CREATE Ext 256 ALLOT
CREATE FileNam 256 ALLOT

Action:

59 _tmp !

BEGIN
  FOR-FILES: "c:\xxx\*.*"
    S" %FOUND-FILENAME%" EVAL-SUBST FileNam PLACE
    FileNam COUNT DUP 2 - 0 MAX /STRING Ext PLACE
    1 _XX @ + _XX !
  ;FOR-FILES
  1 _tmp @ + _tmp !
  _tmp @ 76 =
UNTIL

)#

Мне нужно вместо _XX подставить что-то типа _%Ext COUNT%
Т.е. два символа ИМЕНИ переменной заменить значением 2 вырезанных символов.
Только вот на конструкцию _%Ext COUNT% крон ругается, а как по-другому я не знаю.
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Обработать файлы по разным маскам

Postby Morituruz » Mon, 17 Sep 2012, 16:21

Не знаю как VoidVolker, а я сломал мозг вашим «Можно ли использовать значение одной переменной внутри имени другой переменной?», но ИМХО вам не стоит разводить кучу однотипных переменных.
Я предлагаю это сделать с помощью плагина «списки» от VoidVolker-а (вам нужно будет его подключить):
Code: Select all
#( no_need_variables
S" TEST" add_task
NoLog
NoActive
: file_ext ( -- a u )  \ слово для получения расширения
NODE@ 2DUP S" ;" StringGetPos 1 - MIN
;
: ext_count ( -- a ) \ слово для получения кол-ва этого расширения
NODE@ 2DUP S" ;" StringGetPos /STRING S>NUM
;

STRING-LIST: file_extensions \ создаём список для хранения последних двух букв и их кол-ва
STRING-LIST: files_list \ список для хранения названий файлов
VARIABLE fec \ переменная для учёта
Action:
76 59 DO
   \ заполняем список по типу "75;0", т.е. база данных расширений и их кол-ва через точку с запятой:
   I N>S S" ;" S+ S" 0" S+ file_extensions!
LOOP

FOR-FILES: "c:\xxx\*"
   FOUND-FILENAME DUP 2 - 0 MAX /STRING files_list! \ заносим последние два символа имени файла в список, чтобы каждый раз не дёргать файловую систему
;FOR-FILES

file_extensions(
   0 fec !
   file_ext   \ кладём на стек расширение из нашей базы
   files_list(   \ открываем цикл по файловым расширениям
      2DUP NODE@ COMPARE 0= \ текущее расширение сравниваем с тем, что у нас на стеке лежит
      IF
         fec 1+! \ раз совпало, значит увеличиваем переменную
      THEN
   )files_list
   S" ;" S+ fec @ N>S S+ NODE! \ записываем посчитанное в бд
)file_extensions

\ выводим на консоль то, что насчитали (консоль открывается из меню от иконки nncron):
file_extensions(
   file_ext TYPE SPACE ext_count . CR
)file_extensions
file_extensions LIST-FREE \ очищаем список
files_list LIST-FREE \ и этот тоже
)#

Пусть это сложнее, и списки вам пока не знакомы, зато это будет работать при любом количестве искомых строк :)
User avatar
Morituruz
 
Posts: 725
Joined: Sun, 14 Oct 2007, 01:51

Re: Обработать файлы по разным маскам

Postby VKarpovich » Mon, 17 Sep 2012, 16:53

Moriturus wrote: Я предлагаю это сделать с помощью плагина списки от VoidVolker-а (вам нужно будет его подключить):


Пожалуй это лучше того, что придумал я. Меня самого напрягало большое кол-во однотипных переменных. Но сам алгоритм казался вполне приемлимым. Тем более у меня в запасе еще пару задач подобного типа. К сожалению, как я уже писал ранее, я не большой знаток крона и совсем не знаю форта. А потому мне с трудом даются сложные конструкции, особенно если их надо писать в постфиксном варианте. В любом случае за идею со списками большое спасибо.
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15

Re: Обработать файлы по разным маскам

Postby VoidVolker » Mon, 17 Sep 2012, 19:27

Ох. Повторюсь еще раз: сначала надо описать задачу, а потом уже строить алгоритм решения. Форт способен реализовать бесчисленное множество алгоритмов решения. И все они будут обладать теми или иными свойствами. Поэтому повторяю: какова задача в целом? Не надо усложнять себе и другим людям жизнь в попытках описания сферического коня в вакууме. Надо лишь сказать, что есть, и что должно быть. Не надо пытаться искать решение проблемы. Это ведь довольно просто, не так ли? Если уж так ну очень хочется получить ответ на заданный вопрос, то вот он:
Code: Select all
VARIABLE var_0
VARIABLE var_1
VARIABLE var_2
VARIABLE var
1 var !
S" var_"  var @ N>S S+ EVALUATE
95% вопросов уже обсуждались на форуме или ответы на них есть в мануале.        nnCron 1.93 b15.exe
Как правильно задавать вопросы.
User avatar
VoidVolker
Site Admin
 
Posts: 2898
Joined: Tue, 25 Apr 2006, 17:56

Re: Обработать файлы по разным маскам

Postby VKarpovich » Tue, 18 Sep 2012, 08:59

Спасибо всем за обсуждение. Тему считаю закрытой.
VKarpovich
 
Posts: 29
Joined: Sat, 19 Feb 2011, 16:15


Return to nnCron forum (Russian)

Who is online

Users browsing this forum: No registered users and 7 guests