clojure读取文件->转换Map

来源:互联网 发布:alphago软件 编辑:程序博客网 时间:2024/04/29 13:28

一月份的那篇博客http://blog.csdn.net/lrq1988/article/details/18091901处理数据,其大概意思是读取文件,并将其内容封装到MAP里,使外部能方便索引。当文件有修改的时候,可以使用执行器设置定时更新任务。

当时用java写的,周末在家看clojure,就想用clojure重写一下这个程序,折腾了一会子,感觉又忘了这个clojure序列的惰性化,遂作罢。周一来公司,又试了一下,还挺顺利,就实现了。


贴出几个主要的实现函数:

先说下文件格式吧,类似这样,我文件里面用的tab分隔符:

12345 America  NewYork  Jim23455 China Beijing Felix12346 America  NewYork  Jim23457 China Beijing Felix12349 America  NewYork  Jim23450 China Beijing Felix
主要函数:

;;读取文件并转换成vector(defn read-to-vec [file](with-open [rdr (clojure.java.io/reader file :encoding "gbk")](reduce conj [] (line-seq rdr))))
这一步读取后数据是一个vector

["12345\tAmerica\tNewYork\tJim" "23455\tChina\tBeijing\Felix" ...]
需要将vecotr内的字符串也转换成vecotor,数据变成voctor的vector,这里使用的是序列

;;将序列转换成序列的序列(defn vec-to-vec [v](map #(seq (.split % "\t")) v))
将序列转换成map

;;将序列的序列转化成map(defn vec-to-map [v](into {} (for [x v] (hash-map (first x) x))))
这样就得到了最后的map,形如

{"12345" ["12345" "America" "NewYork" "Jim"] "23455" ["23455" "China" "Beijing" "Felix"] ...}

对map的读取就不赘述了。

关于切割字符串,见下图,前者是java方法生成数组,后者是clojure函数生成vector。


比起java来,clojure区区几行代码就实现了大部分功能,开发起来快多了。





0 0
原创粉丝点击