我正在解析一个大的csv文件,我使用它的第一行作为记录的键。所以对于像csv这样的文件:
header1,header2
foo,bar
zoo,zip
我最终得到了一个懒惰的seq,如:
({:header1 "foo" :header2 "bar"},
{:header1 "zoo" :header2 "zip"})
代码工作正常,但我不确定在以下函数中我是否持有“行”的头部。
(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)))))
请有人澄清一下吗?
答案 0 :(得分:7)
是的,这个表达式在句法上说要保持头部
(let [lines (line-seq rdr)
虽然在这种情况下你应该逃避它,因为它们没有引用
调用map之后的lines
和headers
以及从1.2.x开始的Clojure编译器包含一个名为 locals clearing 的功能:它将函数调用后未使用的任何本地设置为在函数调用的序言中为零。在这种情况下,它会在函数的本地上下文中将行和标题设置为nil,并且它们将使用GCd。这是clojure产生无法用java表示的字节码的罕见情况之一。