作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下 csv:
DATE;DESC;IN;OUT
11/04/13;Buy new shoes;;90
16/04/13;Wage;5000;
17/04/13;Donate money;;200
;;;
30/04/13;Buy new shoes again;;80
我基本上想解析这个 csv 文件,过滤掉空行,然后再对其执行一些计算。我不想使用任何预制的 csv 库,因为我对 clojure 比较陌生,想通过艰苦的方式学习它。
这是我到目前为止所做的:
(ns calc
(:require [clojure.java.io :as io]
[clojure.string :as str]))
(defn filter-empty-lines [coll]
(filter #(not (.startsWith % ";;;")) coll))
(defn parse-lines [coll]
(let [columns [:date :desc :out :in]]
headers (map name columns)
--> STUCK
(defn calculate-costs [f]
(->> (io/reader f)
line-seq
filter-empty-lines
parse-lines))
(calculate-costs "/var/tmp/in_out.csv")
基本上空行的过滤已经有效,但我有点坚持解析的 csv 行的映射。
我的想法是简单地用 ; 分割线并使用 zipmap 创建一个包含关键字的字典 和每一行的 csv 值,并将其添加到一个集合中。
我没有让解析行函数工作,如果有人能帮忙,我会很高兴。我也很感激任何与 clojure 相关的提示/改进想法。
提前致谢
更新
感谢 bsvingen 的回答,我得到了以下结果:
(defn parse-lines [coll]
(map #(let [[date desc out in] (clojure.string/split % #";")]
{:date date :desc desc :out out :in in}) coll))
最佳答案
以下是一个解决方案,您可以使用文件的第一行(标题)来计算关键字:
(defn headers [line]
(map keyword (str/split line #";")))
然后解析一行并返回带有标题的映射
(defn parse-line [headers line]
(zipmap headers (str/split line #";")))
解析所有文件给出:
(defn parse-lines [coll]
(let [head (headers (first coll))]
(map (partial parse-line head) (rest coll))))
现在您有了类似于 map 的电子表格,您可以对给定的列求和:
(defn calculate [sheet column-key]
(->> sheet
(map column-key)
(filter (complement nil?))
(map #(Integer/parseInt %))
(reduce +)))
和计算成本:
(with-open [file (io/reader "./calc.csv")]
(let [sheet (->> file
line-seq
filter-empty-lines
parse-lines)]
(calculate sheet :OUT)))
关于parsing - 如何将 csv 行映射到关键字词典的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832094/
我是一名优秀的程序员,十分优秀!