我正在解析一个大的csv文件,我使用它的第一行作为记录的键.所以对于像以下的csv文件:
header1,header2
foo,bar
zoo,zip
Run Code Online (Sandbox Code Playgroud)
我最终得到了一个懒惰的seq:
({:header1 "foo" :header2 "bar"},
{:header1 "zoo" :header2 "zip"})
Run Code Online (Sandbox Code Playgroud)
代码工作正常,但我不确定在以下函数中我是否持有"行"的头部.
(defn csv-as-seq [file]
(let [rdr (clojure.java.io/reader file)]
(let [lines (line-seq rdr)
headers (parse-headers (first lines))]
(map (row-mapper headers) (rest lines)))))
Run Code Online (Sandbox Code Playgroud)
有人可以澄清一下吗?
是的,这个表达在句法上说是要保持头脑
(let [lines (line-seq rdr)
Run Code Online (Sandbox Code Playgroud)
虽然在这种情况下你应该放弃它,因为它们没有引用
lines和headers在调用map之后,而且从1.2.x开始的Clojure编译器包含一个名为locals clearing的功能:它将函数调用后未使用的任何本地设置为nil在函数调用的序言中.在这种情况下,它会在函数的本地上下文中将行和标题设置为nil,并且它们将使用GCd.这是clojure产生无法用java表示的字节码的罕见情况之一.