3

我正在解析一个大的 csv 文件,我使用它的第一行作为记录的键。所以对于像这样的csv文件:

header1,header2
foo,bar
zoo,zip

我最终得到了一个惰性序列,例如:

({: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)))))

有人可以澄清一下吗?

4

1 回答 1

7

是的,这个表达在句法上说要抱头

(let [lines (line-seq rdr)

尽管在这种情况下你应该摆脱它,因为它们 在调用 map 之后没有引用,lines并且从 1.2.x 开始的 Clojure 编译器包括一个名为locals clearing的功能:它将函数调用后未使用的任何 locals 设置为 nil在函数调用的序言中。在这种情况下,它将在函数的本地上下文中将行和标题设置为 nil,并且它们将在使用时被 GCd。这是 clojure 生成无法在 java 中表达的字节码的罕见情况之一。headers

于 2012-06-05T18:25:15.420 回答