📝

CSV を clojure の hashmap に変換

2024/08/31に公開

CSV(Header付き)をClojureのマップに変換したいことってたびたびあります。
その度に、同じことを調べているのでメモします。

このレポジトリを参考にさせてもらいました。

eva-healthtech/data.csv

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

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