我知道有很多相关的问题,我已经阅读了它们,但仍然没有对如何读取 - 处理 - 写入有一些基本的了解.以下功能为例,它使用clojure-csv库来解析一行
(defn take-csv
"Takes file name and reads data."
[fname]
(with-open [file (reader fname)]
(doseq [line (line-seq file)]
(let [record (parse-csv line)]))))
Run Code Online (Sandbox Code Playgroud)
我想要获得的是将数据读入某些集合,(def data (take-csv "file.csv"))然后再处理它.所以基本上我的问题是如何返回record或更确切地说是记录列表.
"doseq"通常用于具有副作用的操作.在您创建记录集合的情况下,您可以使用"map":
(defn take-csv
"Takes file name and reads data."
[fname]
(with-open [file (reader fname)]
(doall (map (comp first csv/parse-csv) (line-seq file)))))
Run Code Online (Sandbox Code Playgroud)
更好地解析整个文件以减少代码:
(defn take-csv
"Takes file name and reads data."
[fname]
(with-open [file (reader fname)]
(csv/parse-csv (slurp file))))
Run Code Online (Sandbox Code Playgroud)
您也可以使用clojure.data.csv而不是clojure-csv.core.只应该在前一个函数中将parse-csv重命名为take-csv.
(defn put-csv [fname table]
(with-open [file (writer fname)]
(csv/write-csv file table)))
Run Code Online (Sandbox Code Playgroud)