0

我是clojure的新手,想正确地做到这一点。我有来自两个 CSV 文件的两个带有日期戳数据的数据源。我已将它们放入矢量格式的矢量中。我想做一个连接(外连接)类型的数据组合。

;--- this is how I am loading the data for each file.... works great ---
(def csvfile (slurp "table.csv"))
(def csvdat (clojure.string/split-lines csvfile))
(def final (vec (rest (map (fn [x] (clojure.string/split x #",")) csvdat))))

CSV 文件 1:日期值 1 值 2 值 3

CSV 文件 2:日期值 A 值 B 值 C

向量格式的结果向量:日期 value1 value2 value3 valueA valueB valueC

我有几个丑陋的想法,我只想做最好的丑陋想法。:)

选项 1:按顺序获取一组唯一的时间,并将两个向量向量中的所有数据映射到一个新的向量向量 选项 2:有没有聪明的方法可以将两个向量向量映射到一个新向量向量(比我的经验更高级的映射)

做“加入”的最常见的方法是什么?我应该做地图吗?我喜欢向量,因为在加入 csv 后我将进行大量范围计算,例如将窗口(行组)向下移动到加入数据的行中。

4

2 回答 2

0

您的数据:

(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]])

将 CSV 的向量表示向量转换为映射:

(defn to-map [v] (into {} (map (fn [[date & data]] [date data]) v)))

合并地图:

(merge-with into (to-map csv1) (to-map csv2))
于 2018-05-14T10:23:53.773 回答
-2

据我了解,您的数据看起来像这样:

(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)))
于 2012-07-19T19:07:56.143 回答