clojure读取文件->转换Map

一月份的那篇博客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区区几行代码就实现了大部分功能,开发起来快多了。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值