0

私はclojureが初めてで、これを正しく行いたいと思っています。2 つの CSV ファイルからの日付スタンプ付きデータの 2 つのデータ ソースがあります。私はそれらをベクトル形式のベクトルに入れました。データの結合(外部結合)のようなものをしたいと思います。

;--- 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: 日付 value1 value2 value3

CSV ファイル 2: 日付 valueA valueB valueC

ベクトル形式の結果のベクトル: 日付 値1 値2 値3 値A 値B 値C

私はいくつかの醜いアイデアを持っています。最高の醜いアイデアを実行したいだけです。:)

オプション 1: シーケンス内の一意の時間のセットを取得し、ベクトルの 2 つのベクトルからすべてのデータをベクトルの新しいベクトルにマップします オプション 2: ベクトルの 2 つのベクトルから新しいベクトルへのマップを行うことができる巧妙な方法はありますかベクトルの(私の経験で話すことができるよりも高度なマッピング)

「結合」を行う最もクロージュアのアイドマティックな方法は何ですか? 私は地図をやるべきですか?結合されたデータの行の下にウィンドウ(行のグループ)を移動するなど、csvが結合された後に多くの範囲計算を行うため、ベクトルが好きです。

4

2 に答える 2

-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 の 1 行を取るとします。

(def l1 (first csv1))
["01/01/2012" 1 2 3 4]

その1行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))

csv ファイルを解析するための core.clj のルーチン

(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 に答える