提示请求:
如何将一组大型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的组合会更加惯用。