在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
Run Code Online (Sandbox Code Playgroud)
这是我见过的最短的:
(require '[clojure.java.io :as io])
(filter #(.endsWith (.getName %) ".csv") (file-seq (io/file dir))))
Run Code Online (Sandbox Code Playgroud)
来自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..."))))
Run Code Online (Sandbox Code Playgroud)
NB使用clojure-csv库.
如果我能找到一个明显的方法来获得一个过滤目录列表而不诉诸正则表达式,这将更优雅和更短......但它暂时让我望而却步
更新:
Brian 对于globbing的Java支持的链接也是有用且有趣的,并且提供了比简单正则表达式更通用/更健壮的方法 - 但是它依赖于Java 1.7(对某些人来说过于尖端?)并且它并没有真正缩短代码.