在Clojure中做這種事最簡單的方法是什麼?什麼是Ruby的Dir.glob()最簡潔的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
在Clojure中做這種事最簡單的方法是什麼?什麼是Ruby的Dir.glob()最簡潔的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:
Brian與Java support for globbing的鏈接也很有用也很有趣,它提供了比簡單正則表達式更加通用的方法 - 但是它依賴於Java 1.7(對於某些?而言太尖端了),並且它並沒有真正縮短代碼。
http://download.oracle.com/javase/tutorial/essential/io/find.html描述了對Java的支持通配符。正則表達式可能更容易。 – 2011-02-16 20:16:53
嗯我看 - 是的正則表達式似乎更簡單!看起來像一個方便的包裝函數的好候選人雖然....你認爲這將是歡迎在clojure.contrib某處? – mikera 2011-02-16 23:29:34