Список файлов в каталоге с использованием для каждого цикла

Я прочитал несколько примеров кода, но я просто не понимаю, как использовать цикл, подобный foreach, для перебора коллекции файлов. Вот как я получаю список файлов:

ls=:0 dir '*.*'

Я могу повторить это, и это работает нормально. Но что мне нужно сделать, так это обработать каждый файл по 1 за раз, используя какой-то цикл. так что-то вроде:

ls=:0 dir '*.*'
foreach (file in ls) {
 do something(file)
 do something else.. so on
}

в руководствах a для каждого цикла будет выглядеть так:

smoutput each i.10

Ясно, что это бесполезно, он печатает от 1 до 10, я не знаю, как изменить это, чтобы он работал с моим списком каталогов.


j
person ace007    schedule 21.01.2013    source источник


Ответы (2)


Ключевое слово each предназначено для однострочного цикла. Существует for цикл, который можно использовать внутри определенной функции (или глагола ).

Пример:

myFunction =: 3 : 0
    ls =. 1 dir '*.*'
    for_file. ls do.
        doSomething ;file
        doSomethingElse ;file
    end.
)

Вариант for_., пожалуй, самый полезный. Имя вашей переменной file идет прямо между подчеркиванием и точкой. Важно помнить, что цикл for выдает каждый элемент в том виде, в котором он появляется в массиве, поэтому, если ls представляет собой массив строк в рамке, каждая file будет отображаться как одна строка в рамке.

person MPelletier    schedule 21.01.2013
comment
@ ace007 Это должно быть внутри функции. Вы не можете ввести это в приглашении напрямую. Я отредактирую. Также обратите внимание, что 1 dir будет легче пройти. - person MPelletier; 21.01.2013
comment
хорошо, это работает, но после перечисления первых двух файлов я получаю синтаксическую ошибку: myFunction | myFunction 0 правильно ли я вызываю функцию, я также назвал ее как myFunction'' - person ace007; 21.01.2013
comment
Вы называете это правильно. Обратите внимание, что я изменил 0 dir на 1 dir. Что вы делаете внутри своего цикла? Какие функции вы там вызываете? - person MPelletier; 21.01.2013
comment
Чтобы достичь желаемого результата, естественным способом сделать это в J было бы рассматривать список имен файлов как массив и работать непосредственно с массивом/списком. Например, myparsefn each fread each 1 dir '*.*' прочитает содержимое каждого файла в список ящиков, а затем проанализирует содержимое. Альтернативно это можно было бы сформулировать как myparsefn@fread each 1 dir '*.*'. - person Tikkanz; 21.01.2013

Вероятно, вам нужен список такой формы:

ls =: 1 dir '*.*'

который представляет собой список файлов, а не список символов, таких как 0 dir '*.*'.

Вы можете использовать each в этом списке, например:

]ls =: 1 dir '*'
┌──────────┬──────────────┬──────────┬───────────┬───────┐
│build_defs│build_jconsole│build_libj│build_tsdll│jconfig│
└──────────┴──────────────┴──────────┴───────────┴───────┘

;# each ls  NB. number of characters for each filename
10 14 10 11 7
person Eelvex    schedule 21.01.2013