Какой самый краткий эквивалент Clojure для Dir.glob () Руби? - PullRequest
12 голосов
/ 16 февраля 2011

Какой самый простой способ сделать что-то подобное в Clojure?

require 'csv'
Dir["data/*.csv"].each do |file|
  File.readlines(file).each do |line|
    x, y, z = *CSV.parse_line(line)
    # process this data
  end
end

Ответы [ 2 ]

9 голосов
/ 09 февраля 2012

Это самое короткое, что я видел:

(require '[clojure.java.io :as io])

(filter #(.endsWith (.getName %) ".csv") (file-seq (io/file dir))))

От https://github.com/brentonashworth/one/blob/master/src/lib/clj/one/reload.clj#L28

6 голосов
/ 16 февраля 2011

Возможно, не самый краткий из возможных, но, возможно, что-то вроде следующего?

(use 'clojure-csv.core)

(doseq [file (.listFiles (File. "data/"))]
  (if (.matches (.getName file) ".*[.]CSV$")
    (doseq [[x y z] (parse-csv (slurp file))]
       "... do whatever stuff you want with x, y, z..."))))

NB использует библиотеку clojure-csv .

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

ОБНОВЛЕНИЕ:

* 1013Ссылка * Брайана на Поддержка Java для глобализации также полезна и интересна и предлагает более общий / надежный подход, чем простые регулярные выражения - однако это зависит от Java 1.7 (слишком круто для некоторых?) И не даетдействительно значительно сократить код.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...