Ответ 1
Это самое короткое, что я видел:
(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
Какой самый простой способ сделать что-то подобное в 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
Это самое короткое, что я видел:
(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
Возможно, это не самый краткий, но возможно что-то вроде следующего:
(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..."))))
N.B. использует библиотеку clojure-csv.
Это было бы более элегантно и короче, если бы я мог найти очевидный способ получить список фильтрованных каталогов, не прибегая к регулярным выражениям.... но он ускользает от меня на мгновение
UPDATE:
Ссылка Брайана на Поддержка Java для globbing также полезна и интересна и предлагает более общий/надежный подход, чем простые регулярные выражения - однако это зависит на Java 1.7 (слишком передний край для некоторых?), и это не очень сильно сокращает код.