据我了解,您的数据看起来像这样:
(def csv1 [["01/01/2012" 1 2 3 4]["06/15/2012" 38 24 101]])
(def csv2 [["01/01/2012" 99 98 97 96]["06/15/2012" 28 101 43]])
好吧,你可以用它来制作地图。
repl-test.core=> (map #(hash-map (keyword (first %1)) (vec (rest %1))) csv1)
({:01/01/2012 [1 2 3 4]} {:06/15/2012 [38 24 101]})
现在,您有另一个 csv 文件,它的顺序可能相同,也可能不同(上面的 csv2)。
假设我取一行 csv1:
(def l1 (first csv1))
["01/01/2012" 1 2 3 4]
并从这一行 csv2 中连接相同日期的向量
(concat (hash-map (keyword (first l1)) (vec (concat (rest l1) [44 43 42]))))
([:01/01/2012 [1 2 3 4 44 43 42]])
我将把函数的编写留给你作为练习。
这是你想做的吗?
以下是使用 lein new bene-csv 后的一些组件:
项目.clj
(defproject bene-csv "1.0.4-SNAPSHOT"
:description "A csv parsing library"
:dependencies [[org.clojure/clojure "1.4.0"]
[clojure-csv/clojure-csv "1.3.2"]
[util "1.0.2-SNAPSHOT"]]
:aot [bene-csv.core]
:omit-source true)
core.clj(只是标题)
(ns bene-csv.core
^{:author "Charles M. Norton",
:doc "bene-csv is a small library to parse a .csv file.
Created on March 8, 2012"}
(:require [clojure.string :as cstr])
(:require [util.core :as utl])
(:use clojure-csv.core))
core.clj 中的例程来解析 csv 文件
(defn ret-csv-data
"Returns a lazy sequence generated by parse-csv.
Uses utl/open-file which will return a nil, if
there is an exception in opening fnam.
parse-csv called on non-nil file, and that
data is returned."
[fnam]
(let [ csv-file (utl/open-file fnam)
inter-csv-data (if-not (nil? csv-file)
(parse-csv csv-file)
nil)
csv-data (vec
(filter
#(and pos? (count %) (not (nil? (rest %))))
inter-csv-data))]
(pop csv-data)))