Clojure 如何获取每天CSV日志条目的计数

Clojure 如何获取每天CSV日志条目的计数,clojure,Clojure,如果我有一个类似以下内容的CSV文件: date,description, Mon Jul 25 14:34:49 EDT 2016, some entry, Mon Jul 25 17:35:11 EDT 2016, some other entry, Mon Jul 25 21:52:05 EDT 2016, yet another entry, Mon Jul 25 22:35:59 EDT 2016, some entry, Mon Jul 25 23:54:19 EDT 2016, s

如果我有一个类似以下内容的CSV文件:

date,description,
Mon Jul 25 14:34:49 EDT 2016, some entry,
Mon Jul 25 17:35:11 EDT 2016, some other entry,
Mon Jul 25 21:52:05 EDT 2016, yet another entry,
Mon Jul 25 22:35:59 EDT 2016, some entry,
Mon Jul 25 23:54:19 EDT 2016, some other entry,
Tue Jul 26 00:31:41 EDT 2016, some entry,
Wed Jul 27 15:45:08 EDT 2016, yet another entry,
Wed Jul 27 16:15:50 EDT 2016, some entry,
有什么好方法可以获得一个数据结构,该数据结构是每天的条目数,这样我就可以得到:

[{:日期“2016-07-25”:计数5}…]


我正在读取一个csv文件,并使用clojure.data.JSON/write-str将日期计数返回为JSON,因此上述数据结构在另一种格式中可能会更好。

这里有一种方法。我在管道的每一步都添加了注释:

(定义行“日期、说明、,
2016年7月25日星期一14:34:49美国东部夏令时,一些条目,
2016年7月25日星期一17:35:11美国东部夏令时,其他一些条目,
2016年7月25日星期一美国东部时间21:52:05,另一个条目,
2016年7月25日星期一22:35:59美国东部夏令时,一些条目,
2016年7月25日星期一23:54:19美国东部时间,其他一些条目,
2016年7月26日星期二00:31:41美国东部夏令时,一些条目,
2016年7月27日星期三美国东部夏令时15:45:08,又一个条目,
2016年7月27日星期三美国东部夏令时16:15:50,部分条目“)
(>>;去排队
线
把他们分开
clojure.string/split-line
;丢弃收割台
休息
;只保留日期
(map#(第一个(clojure.string/split%#“,”))
;让他们约会
(地图#(日期%))
;按yyyy-MM-dd对其进行分组
(按#(.format(simpleDataFormat.“yyyy-MM-dd”)%分组)
;制作一个键为{:date:count}的映射
(减少千伏#(关联%1%2{:日期%2:计数(计数%3)}{})
;仅保留此生成地图的值
VAL)
=>({:日期“2016-07-25”,计数2}{:日期“2016-07-26”,计数4}{:日期“2016-07-27”,计数2})
另一种使用
频率
代替
分组方式

(->);获取行
线
把他们分开
clojure.string/split-lines rest
记住日期
(map#(第一个(clojure.string/split%#“,”))
;格式为yyyy-MM-dd
(地图#(.format(SimpleDateFormat.“yyyy-MM-dd”)(日期%))
;计算频率
频率
;用它绘制一张地图,这次你不需要计算你自己,因为频率为你做了这件事
(减少千伏#(关联%1%2{:日期%2:计数%3}{})
;只保留我们创建的地图的值
VAL)
=>({:日期“2016-07-25”,计数2}{:日期“2016-07-26”,计数4}{:日期“2016-07-27”,计数2})
就性能而言,它们是相似的,在我的计算机上,分析100k行需要大约2秒钟


如果性能是一个瓶颈问题,您可能只想创建一个
SimpleDateFormat
,甚至自己将日期从字符串格式化为
yyyy-MM-dd
,而根本不创建
日期。但只有在需要时,性能才已经相当不错:)

请添加您尝试过的内容以及失败的原因。一个简单的开始是解析日期,只有你yyy mm dd,然后使用
频率
或者
分组方式
,如果你需要的不仅仅是计数。我意识到我应该在询问之前做得更多。我会尝试一个天真的开始,然后回来报告!这是优雅的!我确实想出了一个非常复杂的解决方案,我不敢发布。在我糟糕的解决方案之后看到你的解决方案真是太棒了。我很高兴在看到你的想法之前,我已经完成了这个练习。我肯定会同意你的解决方案。非常感谢。不客气@THX1137,我用
频率更新了答案,以显示差异以及一些与性能相关的评论。跟上Clojure,没有什么可羞耻的,你很快就能做得更好;)