过滤(重复数据删除)和concat csv文件

时间:2015-10-27 02:36:25

标签: clojure

提示请求:

如何将一组大型csv文件连接成一个。我需要删除标识为重复项的行(即过滤器(一些#{s}(获取行1))每个文件都没有重复项,实际上,只有文件之间才能出现重复行。最终输出的顺序不是't'至关重要,但首选匹配文件的顺序扫描。

要维护的ID总数大约是150,000,000,所以我认为维持一个内存大的集合是可行的。

所以,我有一个fn,它接受一个文件名和一组id来避免并返回一个过滤的行序列。我还有一个要处理的文件名向量。我无法解决如何将过滤后的行输出到单个文件,同时将每个过滤行集合中的ID合并到现有集合中。

(defn open-seq "read file f and filter rows based on set s" [f s]
   (letfn [(iset? [x]
             (let [ls (s/split x #", ")
                   id (read-string (get ls 1))]
               (not (some #{id} s))))]
(with-open [in (io/reader f)]
  (->> (line-seq in)
       (filter iset?)
     ; shortcut  (take 20)
       doall)
  ))

编辑:

这是一个两遍解决方案。

(defn proc [infiles outfile]
  (with-open [outf (io/writer outfile)]
   (let [s (atom #{})]
     (doseq [infile infiles]
      (with-open [in (io/reader infile)]
       (doseq [line (open-seq in @s)]
        (.write outf line)
        (.newLine outf)))
      (with-open [in (io/reader infile)]
       (let [ids (->> (open-seq in @s)
                     (map (fn [x] (get x 1))))]
        (swap! s conj ids)
        ))
    ))))

我想我可以用每一行将每个id组合到set atom上。我想这有一个先入为主的观念,即整个seid的组合会更加惯用。

0 个答案:

没有答案