假设我有相同的文件名,放置在五个不同的子文件夹中。相关文件在所有文件夹中具有相同的名称,但在其他方面具有不同的值。
假设我的文件名为 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)))
我尝试访问子文件夹 A1
中的文件 test.csv
,我将其作为参数传递给我的 csv 读取函数。
现在显然上面的代码不起作用,但它提供了我想要实现的目标的概述。
如何才能使最小的示例发挥作用?
谢谢。
最佳答案
类似这样的事情应该将一个文件夹中的数据放入一系列序列中:
(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
与包装成[]
如果你想要一个向量的向量。这假设 folder
是一个字符串。因为您的文件非常小,所以您不需要使用阅读器打开它们,因此更容易读取它们然后解析它们。
您的原始代码存在一些问题:
- 您总是尝试读取名为
“./resources/SUB-FOLDER/test.csv”
的文件,而不是替换文件夹的名称。 - 您不想在函数内使用
def
。请参阅让
。 - 在已实现的序列上调用
lazy-seq
不会执行任何操作。 - 通过在阅读器上调用
doall
,您将所有数据强制写入内存,而不是边读边处理(这就是我用 slurp 替换它的原因)。如果您要在阅读时循环处理它,则需要将with-open
放在循环之外(而不是 doall)。
关于csv - 函数参数作为 Clojure 中文件路径的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33187295/