Clojure读取TXT生成迷你数据库后,无法访问Map字段如何解决?
问题分析与解决
你的代码最终返回的是包含多个客户Map的Vector,而非单个Map。直接用(get zipmap :custID)是在整个Vector上操作,Vector本身没有:custID键,所以返回nil。
正确访问方式
先将读取结果存储到变量中,再针对单个客户Map访问字段:
;; 执行读取代码并保存结果 (def customers (with-open [reader (clojure.java.io/reader "cust.txt")] (vec (for [line (line-seq reader)] (->> (clojure.string/split line #"\|") (remove empty?) (zipmap [:custID :name :address :phoneNumber])))))) ;; 访问第一个客户的custID (get (first customers) :custID) ;; 更简洁的写法 (:custID (first customers)) ;; 遍历所有客户,获取他们的姓名 (map :name customers) ;; 查找custID为"2"的客户 (first (filter #(= (:custID %) "2") customers))
代码优化建议
可以添加格式校验,确保每行分割后的字段数量符合预期,避免因空行或格式错误生成异常Map:
(def customers (with-open [reader (clojure.java.io/reader "cust.txt")] (vec (for [line (line-seq reader) :let [parts (clojure.string/split line #"\|") valid-parts (remove empty? parts)] :when (= 4 (count valid-parts))] ; 确保字段数为4 (zipmap [:custID :name :address :phoneNumber] valid-parts)))))
内容的提问来源于stack exchange,提问作者Zain Mushtaq
相关产品推荐
相关产品推荐

