假设我有相同的文件名,放在五个不同的子文件夹中。有问题的文件在所有文件夹中具有相同的名称,但具有不同的值。
假设我的文件被称为test.csv
。我的文件夹是A1,A2,A3,A4
和A5
。
我的数据读取结构如下:
(defn my-data [folder]
(loop [SUB-FOLDER (str 'folder)
X []
data (with-open [file (clojure.java.io/reader "./resources/SUB-FOLDER/test.csv")]
(doall (csv/read-csv file)))]
(def row (first data))
(if (nil? row)
[(lazy-seq X)]
(recur (conj X (map #(Float/parseFloat %) row))
(rest data)))))
我会把这个函数称为
(def Y (map vec (get (my-data A1) 0)))
我试图访问子文件夹test.csv
中的文件A1
,我将其作为参数传递给我的csv-read函数。
现在显然上面的代码不起作用,但它提供了我想要实现的内容的概述。
如何让最小的例子起作用?
感谢。
答案 0 :(得分:2)
这样的事情应该把你的数据从一个文件夹放到一系列序列中:
(defn read-data [folder]
(let [data (csv/read-csv (slurp (str "./resources/" folder "/test.csv")))]
(for [line data]
(map #(Float/parseFloat %) line))))
如果您想要向量,请将map
更改为mapv
,如果您想要向量向量,请将for
与into []
包装在一起。这假设folder
是一个字符串。因为你的文件非常小,你不需要用阅读器打开它们,所以更容易啜饮它们然后解析它们。
您的原始代码存在问题:
"./resources/SUB-FOLDER/test.csv"
的文件,而不是替换文件夹的名称。def
。请参阅let
。lazy-seq
不会执行任何操作。doall
,您可以将所有数据强制存储到内存中,而不是随时读取和处理(这就是为什么我用slurp替换它)。如果您在阅读时要在循环中处理它,那么您希望循环外的with-open
(并且没有doall)。