一月份的那篇博客http://blog.csdn.net/lrq1988/article/details/18091901处理数据,其大概意思是读取文件,并将其内容封装到MAP里,使外部能方便索引。当文件有修改的时候,可以使用执行器设置定时更新任务。
当时用java写的,周末在家看clojure,就想用clojure重写一下这个程序,折腾了一会子,感觉又忘了这个clojure序列的惰性化,遂作罢。周一来公司,又试了一下,还挺顺利,就实现了。
贴出几个主要的实现函数:
先说下文件格式吧,类似这样,我文件里面用的tab分隔符:
12345 America NewYork Jim
23455 China Beijing Felix
12346 America NewYork Jim
23457 China Beijing Felix
12349 America NewYork Jim
23450 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区区几行代码就实现了大部分功能,开发起来快多了。