我正在学习clojure并尝试读取文件并使用返回的结果向量执行某些操作。在这种情况下,我只是想把它打印出来。
以下是有问题的代码:
(defn read_file
"Read in a file from the resources directory"
[input]
(with-open [rdr (reader input)]
(doseq [line (line-seq rdr)])))
(defn -main []
(println (read_file "resources/input.txt") ))
println返回“nil”。我需要做什么才能返回“line”
答案 0 :(得分:4)
如果文件不是很大,您可以使用slurp
将文件内容作为字符串读取,然后将其拆分为特定的分隔符(在本例中为\n
)。
(defn read-file [f]
(-> (slurp f)
(clojure.string/split-lines)))
答案 1 :(得分:2)
doseq
返回nil。当你以do
方式对序列的元素进行处理时,它应该被使用,所以大部分都是副作用。
试试这个:
(defn file->vec
"Read in a file from the resources directory"
[input]
(with-open [rdr (reader input)]
(into [] (line-seq rdr))))
但是你不应该为大文件执行此操作,在这种情况下,您不希望整个文件位于内存中。出于这个原因,slurp
同样糟糕。