📝
CSV を clojure の hashmap に変換
CSV(Header付き)をClojureのマップに変換したいことってたびたびあります。
その度に、同じことを調べているのでメモします。
このレポジトリを参考にさせてもらいました。
1. コード
deps.edn
{:deps {org.clojure/data.csv {:mvn/version "1.0.1"}}
:paths ["src" "resources"]}
src/core.clj
(ns core
(:require [clojure.data.csv :as csv]
[clojure.java.io :as io]))
(defn read-csv [filename]
(with-open [reader (io/reader (io/resource filename))]
(doall
(csv/read-csv reader))))
(defn csv-data->maps [csv-data]
(map zipmap
(->> (first csv-data) ;; First row is the header
(map keyword)
repeat)
(rest csv-data)))
- csv のセパレータを指定したい場合は read-csv 関数にオプションで指定します。(参照:https://clojure.github.io/data.csv/#clojure.data.csv/read-csv)
;; タブで区切りたい場合 (csv/read-csv reader :separator \tab)
2. test data
resources/MOCK_DATA.csv
id,first_name,last_name,email,gender,ip_address
1,Luigi,Sirmond,lsirmond0@discovery.com,Male,141.106.5.93
2,Warden,McHale,wmchale1@mtv.com,Male,174.196.204.77
3,Patten,Umbers,pumbers2@jugem.jp,Male,58.111.216.196
3. test
(-> "MOCK_DATA.csv"
read-csv
csv-data->maps)
({:id "1",
:first_name "Luigi",
:last_name "Sirmond",
:email "lsirmond0@discovery.com",
:gender "Male",
:ip_address "141.106.5.93"}
{:id "2",
:first_name "Warden",
:last_name "McHale",
:email "wmchale1@mtv.com",
:gender "Male",
:ip_address "174.196.204.77"}
{:id "3",
:first_name "Patten",
:last_name "Umbers",
:email "pumbers2@jugem.jp",
:gender "Male",
:ip_address "58.111.216.196"})
4. memo
4.1. io/resource と io/reader
classpath 内のファイルを使いたくない場合は、
[reader (io/reader (io/resource filename))]
を
[reader (io/reader filename)]
にしてフルパス渡してください。
4.2. テストデータは mockaroo
この手のテストデータは https://www.mockaroo.com/ が便利です。いつもお世話になってます。
Discussion