0

在 Conjure 中,我需要读入一个长文件,太长而无法插入,我希望将打开的文件指针传递给我可以递归调用的方法,直到它为空。我找到了使用 open-with 的示例,但是有没有办法打开文件,然后在函数内部读取文件?指向示例或文档会有所帮助。

4

2 回答 2

2

这是否符合您的想法?

(defn process-file [f reader]
  (loop [lines (line-seq reader) acc []]
    (if (empty? lines)
      acc
      (recur (rest lines) (conj acc (f (first lines)))))))

(let [filename "/path/to/input-file"
      reader (java.io.BufferedReader. (java.io.FileReader. filename))]
  (process-file pr-str reader))

请注意,如果您(require '[clojure.java.io :as io])可以将io/reader其用作调用的快捷方式BufferedReader,则可以FileReader直接使用。但是,使用with-open仍然是可取的——它可以确保文件被正确关闭,即使在发生异常的情况下——并且您绝对可以将打开的阅读器从with-open块内传递给其他函数。

这是with-open您在发布的答案中使用的场景中如何使用的方法,将读取器和写入器对象传递给函数:

(with-open [rdr (io/reader "/path/to/input-file")]
  (with-open [wtr (io/writer "/path/to/output-file")]
    (transfer rdr wtr)))

我还应该注意,在我的示例场景中,它会优于mapreduce优于line-seq但我使用loop/recur因为您询问了递归。

这是命名空间上的 ClojureDocs 页面clojure.java.io

于 2013-08-19T02:48:30.823 回答
0

玩弄我发现了答案,所以对于任何其他人来说,这是我的解决方案的一个版本。

(defn transfer
  [inFile outFile]
  (.write outFile (.read inFile))
...

...
(transfer (clojure.java.io/reader "fileIn.txt)
          (clojure.java.io/writer "out.txt"))
于 2013-08-19T02:46:20.317 回答