我想将我读入的数据汇总为CSV格式。我试过d3.nest并且它有效,但它不是我正在寻找的,因为它将数据转换为JSON结构。对我来说重要的是保持CSV接口不变,以便我的可重用图表能够使用原始或聚合的CSV数据。我认为如果可以使用map reduce进行聚合会很棒。
例如转换为:
a,b,c
1,1,1
1,2,1
1,3,1
1,4,1
2,1,1
2,2,1
2,3,1
2,4,1
3,1,1
3,2,1
3,3,1
3,4,1
3,5,1
3,6,1
4,1,1
4,2,1
进入这个:
a,d
1,4
2,4
3,6
4,2
我尝试了Adam Pearce提出的解决方案,但它没有用,因为它将数据聚合成字符串格式。根据亚当斯的想法,我修改了一些代码。我使用嵌套进行聚合和映射以获得我想要的数据结构。以下是我最终提出的内容:
var aggregated = d3.nest()
.key(function(d) {
var ts;
var key = new Date(parseInt(d.ms_since_epoch));
key.setMinutes(0);
key.setSeconds(0);
key.setMilliseconds(0);
return key.getTime();
})
.rollup(function(leaves) { return leaves.length; })
.entries(data)
.map(function(d) { return {'ms_since_epoch': d.key, 'requests_hour': d.values}; })
答案 0 :(得分:2)
我不确定这是一个好主意 - 您可能想要将您从显示方式中读取数据的方式解耦 - 但是从d3.nest创建CSV并不太复杂;
d3.nest()
.key(function(d){ return d.a; })
.rollup(function(leaves) { return leaves.length; })
.entries(data)
.map(function(d){ return d.key + ',' + d.values; })
.join("\n")
答案 1 :(得分:1)
您可以使用Alasql库。
您可以从CSV文件(以及XLSX文件)中读取数据:
alasql('SELECT a, COUNT(*) AS d FROM CSV("mydata.csv",{headers:true}) GROUP BY a',
[],function(data){
// use data in d3.
});
或者如果您已经在内存中加载了数据,则可以使用alasql()的同步版本:
var csvData = [{a:1,b:1,c:1},{a:1,b:2,c:1},{a:1,b:3,c:1}];
var data = alasql('SELECT a, COUNT(*) AS d FROM ? GROUP BY a',[csvData]);
在jfFiddle尝试this example。