1

我想将我读入的数据汇总为 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 提出的解决方案,但它不起作用,因为它将数据聚合成字符串格式。基于 Adams 的想法,我稍微修改了代码。我使用 nest 进行聚合和映射来获得我想要的数据结构。这是我最后想到的:

    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}; })
4

2 回答 2

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")
于 2013-07-18T14:41:02.463 回答
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试试这个例子

于 2014-12-19T06:02:17.613 回答