加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用clojure-csv.core解析一个巨大的csv文件

发布时间:2020-12-14 04:36:13 所属栏目:大数据 来源:网络整理
导读:到目前为止,我有: (:require [clojure-csv.core :as csv])(:require [clojure.java.io :as io]))(def csv-file (.getFile (clojure.java.io/resource "verbs.csv")))(defn process-csv [file] (with-open [rdr (io/reader file)] (csv/parse-csv rdr))) 但
到目前为止,我有:

(:require [clojure-csv.core :as csv])
(:require [clojure.java.io :as io]))

(def csv-file (.getFile  (clojure.java.io/resource "verbs.csv")))

(defn process-csv [file]
  (with-open  [rdr  (io/reader file)]
    (csv/parse-csv rdr)))

但我收到java.io.IOException:Stream已关闭.我使用的是clojure-csv,它暴露了两种方法,我使用的第一种方法是parse-csv,doc说:

Takes a CSV as a char sequence or string,and returns a lazy sequence of vectors of strings

我想我知道:with-open是懒惰的,而且(csv / parse-csv rdr))中的rdr是csv文件的一行吧?

PS.我也想搜索文件,重复打开文件是否很昂贵(即使它是懒惰地阅读)并搜索整个内容?

解决方法

with-open不是懒惰的,但是如果你在open-open中做一些懒惰的事情,如果懒惰动作没有强制在with-open的范围内,你可能会遇到问题.需要做的是在退出with-open块之前强制所有延迟结果.

(defn process-csv [file]
  (with-open [rdr (io/reader file)]
    (doall (csv/parse-csv rdr))))

函数doall旨在确保实现整个延迟序列.

由于输入的大小,另一种可能性是安排自己关闭阅读器,然后将惰性用于其预期目的(仅在您需要时生成结果).

(defn find-results
 [stream]
 (for [record stream
       :while (seq (first record))]
   record))

(def rdr (io/reader "verbs.csv"))
(def csv (csv/parse-csv rdr))

(def results (doall (find-results csv)))

(.close rdr)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读