[英]is possible to create a map with 2 keys and a vector of values in Clojure?
我正在尝试创建一个程序,该程序从 csv 文件中读取温度表,并希望访问基于年份和日期的温度集合。
第一列代表记录温度的年份。 第二列代表每个月的特定日期。 该列的 rest 代表每个月的温度。
例如,2021 - 23 - 119 = 2021 年 6 月 23 日的温度为 119
Year Day Months from January to December
2018 18 | 45 54 -11 170 99 166 173 177 175 93 74 69
2021 23 | 13 87 75 85 85 119 190 172 156 104 39 53
2020 23 | 63 86 62 128 131 187 163 162 138 104 60 70
到目前为止,我已经设法从 CSV 文件加载数据clojure.data.csv
。 这会将一系列向量返回到程序中
(defn Load_csv_file [filepath]
(try
(with-open [reader (io/reader filepath)]
(.skip reader 1)
( let [data (csv/read-csv reader)]
(println data) )
)
(catch Exception ex (println (str "LOL Exception: " (.toString ex))))
))
我目前正在尝试弄清楚如何实现这一点,但我的推理是在 map 中创建三个键,这三个键将接受年、日和温度矢量,然后过滤特定值。
关于如何实现此功能的任何建议。
谢谢!
我会 go 这样的事情:
(require '[clojure.java.io :refer [reader]]
'[clojure.string :refer [split blank?]]
'[clojure.edn :as edn])
(with-open [r (reader "data.txt")]
(doall (for [ln (rest (line-seq r))
:when (not (blank? ln))
:let [[y d & ms] (mapv edn/read-string (split ln #"\s+\|?\s+"))]]
{:year y :day d :months (vec ms)})))
;;({:year 2018,
;; :day 18,
;; :months [45 54 -11 170 99 166 173 177 175 93 74 69]}
;; {:year 2021,
;; :day 23,
;; :months [13 87 75 85 85 119 190 172 156 104 39 53]}
;; {:year 2020,
;; :day 23,
;; :months [63 86 62 128 131 187 163 162 138 104 60 70]})
顺便说一句,我不确定 csv 格式是否允许使用不同的分隔符(正如您在示例中所使用的那样……无论如何,这个可以解决这个问题)
我会创建一个 map 的数据,看起来像这样
{2020 {23 {:months [63 86 62 128 131 187 163 162 138 104 60 70]}}}
通过这种方式,您可以相当简单地(get-in data [2020 23:months]
所以像这样
(->> (Load_csv_file "file.csv")
(reduce (fn [acc [year day & months]] (assoc-in acc [year day] months)) {}))
这将导致我现在提到的数据结构你只需要弄清楚你想要的数据的位置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.