csv 在Clojure中是否可以创建一个包含两个键和一个值向量的Map?

jaxagkaj  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(138)

我正在尝试创建一个程序,从csv文件中读取温度表,并希望访问一个基于年份和日期的温度集合。
第一栏代表记录气温的年份,第二栏代表每月某一天,其余各栏代表每月的气温。
例如,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中创建三个关键字,将在年,日和温度矢量,然后过滤一个特定的值。
关于我如何实现这个功能的任何建议。
谢谢!

6g8kf2rb

6g8kf2rb1#

我会这么说:

(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格式是否允许不同的分隔符(正如你在你的例子中所做的那样......无论如何,这一个将适用于它)

相关问题