在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
答案 0 :(得分:9)
这是我见过的最短的:
(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
答案 1 :(得分:6)
可能不是最简洁的,但可能是以下内容?
(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库。
如果我能找到一种显而易见的方法来获取过滤目录列表而不诉诸正则表达式,那么这将更加优雅和简短......但它暂时没有我
<强>更新强>
Brian与Java support for globbing的链接也很有用,并且提供了比简单正则表达式更通用/更健壮的方法 - 但它依赖于Java 1.7(对某些人来说太过尖锐?)并且它并没有真正缩短代码很多。