csv - 函数参数作为 Clojure 中文件路径的一部分

标签 csv clojure

假设我有相同的文件名,放置在五个不同的子文件夹中。相关文件在所有文件夹中具有相同的名称,但在其他方面具有不同的值。

假设我的文件名为 test.csv。我的文件夹是 A1,A2,A3,A4A5

我的数据读取结构如下所示:

(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/

相关文章:

sql - 循环遍历列 SQL

loops - 在 Julia 中存储 For 循环的结果

clojure - Lisp 方言以及与 Java/C# 的比较

Clojure:为什么我不能在不调用它们的情况下引用类方法?

powershell - 在Powershell中将嵌套的哈希表导出到CSV

csv - 缺少前导引号的 CSV 数据是否被视为格式错误?

php - 使用大型数据集将 Parse JSON 输出转换为 CSV

php - 是否有用于 php 的纯 html 模板系统?

clojure - Lisp解释时 "reader"的任务是什么?

scala - Clojure clojure.core.reducers/fold 和 Scala Fold 有什么区别?