d3.csv.parseRows和d3.csv输出不同的结果

时间:2014-09-18 16:59:26

标签: csv d3.js

我正在处理一个数据集,需要进行一些清理才能用d3进行可视化。

我将展示一个简化版本,我正在尝试创建一个csv文件的等效项。

为什么输出不同?

// create header for csv
var csv_test = "date, one, two, three\n";

function init() {
    for (i=1;i<25;i++) {
        // create the csv
        temp = "1/"+i+"/14" +"," + i + "," +i*2 + "," + i*3 + "\n";
        csv_test += temp;
    } 
    console.log(csv_test);

    var new_csv = d3.csv.parseRows(csv_test);
    console.log(new_csv);

    d3.csv("test.csv", function(error, data) {
        console.log(data);
    })
}
init();

csv_test输出以下内容:

date, one, two, three
1/1/14,1,2,3
1/2/14,2,4,6
1/3/14,3,6,9
1/4/14,4,8,12

现在如果我使用d3.csv.parseRows(csv_test)它会返回:

[Array[4], Array[4], Array[4], Array[4], Array[4], Array[4], etc

如果我将原始csv_test从控制台复制并粘贴到新的.csv文件中并使用d3.csv,我会在控制台中获得不同的输出:

[Object, Object, Object, Object, Object, Object, Object, Object, etc]

如何让d3.csv.parseRows输出与使用d3.csv加载数据相同的结果?

感谢。

2 个答案:

答案 0 :(得分:1)

目前还不清楚为什么要这样做,但这是实现这一目标的一种方式:

var new_csv = d3.csv.parseRows(csv_test).slice(1).map(function (d) {
    return { date: d[0], one: d[1], two: d[2], three: d[3] };
})

请注意,在将它们转换为对象之前,我已从已解析的行中删除了标题行。

现在,您可以通过反射解析第一个标题行并动态创建返回的对象来获得聪明并确定要构造的对象。

答案 1 :(得分:0)

parseRows返回数组的原因是因为它假定没有标题行。因此,它不需要Object来存储信息,因此它只会将整行放入数组中。

另一方面,

d3.csv(以及d3.csv.parse())确实假设第一行是标题行。所以它需要一个对象来存储列名。

您可能必须自己将数组转换为对象。