gpt4 book ai didi

file-io - 将 clojure 映射/数组写入文件并读取它们

转载 作者:行者123 更新时间:2023-12-04 01:30:35 26 4
gpt4 key购买 nike

我需要将 clojure map 保存到一个文件中,然后再读回来以处理它们。

这是我能想到的。有没有更好的方法来完成同样的事情?

user=> (def my-data (for [ a [ "Person1" "Person2" ]  b [ "Address1" "Address2"]  c   (range 10) ] {:name a :address b :index c} ))
#'user/my-data
user=> (count my-data)
40

user=> (defn write-data[xs] (with-open [wrtr (clojure.java.io/writer "my-data.txt") ]
(doall (map #(.write wrtr (str % "\n")) xs))))
#'user/write-data

user=> (write-data my-data)

user=> (defn read-data[] (with-open [rdr (clojure.java.io/reader "my-data.txt") ]
(doall (map #(load-string %) (line-seq rdr)))))
#'user/read-data

user=> (count (read-data))
40

最佳答案

从文件中读取单个表单是最容易的,因此我通常将数据放入向量中。
我也更喜欢使用 pr 或 pr-str而不是打印,因为它保证产生可读的数据,

(def my-data [{:a "foo" :b [1 2 3]} "asdf" 42 #{1 2 3}]) 
(spit "/tmp/data.edn" (with-out-str (pr my-data)))
nil
(read-string (slurp "/tmp/data.edn"))
[{:a "foo", :b [1 2 3]} "asdf" 42 #{1 2 3}]

对比:
(spit "/tmp/data.edn" (with-out-str (print my-data)))
(read-string (slurp "/tmp/data.edn"))
[{:a foo, :b [1 2 3]} asdf 42 #{1 2 3}]

注意字符串“asdf”是如何作为符号读回的。
.toString也工作正常:
(spit "/tmp/data.edn" (.toString my-data)) 
(read-string (slurp "/tmp/data.edn"))
[{:a "foo", :b [1 2 3]} "asdf" 42 #{1 2 3}]

关于file-io - 将 clojure 映射/数组写入文件并读取它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147717/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com