【发布时间】:2018-02-13 03:19:38
【问题描述】:
我有一个输入 csv 文件,需要为每个输入行生成一个输出文件。每个输入行可以是特定类型(比如“旧”或“新”),只能通过处理输入行来确定。
除了生成输出文件之外,我们还想打印输入文件中每种类型的行数的摘要。我的实际任务涉及根据输入行类型生成不同的 SQL,但为了保持示例代码的重点,我保持函数 proc-line 中的处理简单。函数 func 确定输入行的类型——再一次,我通过随机生成一个类型来保持它的简单性。实际逻辑更复杂。
我有以下代码,它可以完成这项工作。但是,为了保留生成摘要任务的功能样式,我选择返回一个关键字来表示每一行的类型,并创建了一个惰性序列来生成最终摘要。在命令式风格中,我们只需为每种线型增加一个计数。仅仅为了汇总而生成一个可能很大的集合似乎效率低下。我编码方式的另一个后果是重复 (.write writer ...) 部分。理想情况下,我只会编写一次代码。
对于消除我发现的两个问题(以及其他问题)有何建议?
(ns file-proc.core
(:gen-class)
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn func [x]
(rand-nth [true false]))
(defn proc-line [line writer]
(if (func line)
(do (.write writer (str line "\n")) :new)
(do (.write writer (str (reverse line) "\n")) :old)))
(defn generate-report [from to]
(with-open
[reader (io/reader from)
writer (io/writer to)]
(->> (csv/read-csv reader)
(rest)
(map #(proc-line % writer))
(frequencies)
(doall))))
【问题讨论】:
-
这个问题似乎更适合 CodeReview.SE。
标签: clojure functional-programming