从D3中的多个csv文件导入数据

时间:2014-02-18 01:03:25

标签: javascript arrays csv import d3.js

我是D3的新手,刚刚开始研究一个项目。我的问题是这个。 我想从D3中的2个csv文件导入数据,以便将它们用于图形比较。我面临的问题是:

1.如何从多个csv文件导入数据 2.我可以为每个csv使用一个数组,或者D3只使用一个全局数据数组吗?  3.有没有办法从csv文件中选择某个列来导入?
这是一个例子,我想从单独数组中的每个文件导入“oldVer”,然后使用2个数组来处理。这在D3中是可行的吗?

csv 1
时间,oldVer,newVer,oldT,蝾螈
1,180930,190394,24,59
2,198039,159094,26,45
3,152581,194032,22,61

csv 2
时间,oldVer,newVer,oldT,蝾螈
1,184950,180435,27,26
2,120590,129409,13,13
3,165222,182133,60,54

再次对这个愚蠢的问题感到抱歉,但我对此事的反馈很少。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:15)

在d3版本5中,您可以使用Promise.all加载多个csv文件。示例:

Promise.all([
    d3.csv("file1.csv"),
    d3.csv("file2.csv"),
]).then(function(files) {
    // files[0] will contain file1.csv
    // files[1] will contain file2.csv
}).catch(function(err) {
    // handle error here
})

More info about loading csv in d3 v5

More info about Promise.all()

答案 1 :(得分:12)

您只需多次致电d3.csv

d3.csv("csv1.csv", function(error1, data1) {
  d3.csv("csv2.csv", function(error2, data2) {
    // do something with the data
  });
});

关于你的第三个问题,不,D3会解析一切。没有什么可以强迫你使用所有数据,所以如果你只对一列感兴趣,只需使用那里的数据。

答案 2 :(得分:12)

您可以使用d3 queue同时加载文件。一个例子;

d3.queue()
.defer(d3.csv, "file1.csv")
.defer(d3.csv, "file2.csv")
.await(function(error, file1, file2) {
    if (error) {
        console.error('Oh dear, something went wrong: ' + error);
    }
    else {
        doStuff(file1, file2);
    }
});

答案 3 :(得分:0)

Stuart Hallows的答案是正确的 - 在d3中使用d3.queue来加载多个文件。 我建议不要像Lars Kotthoff的回复那样嵌套多个文件的加载 - 这不是最佳做法。

编辑:我想澄清嵌套不是最佳做法的原因。它降低了代码的可读性/理解能力,并且还有更好,更语义的方法来处理多个异步代码块(即回调和承诺)。

最好在所有文件加载任务完成后使用回调并将结果传递给它。回调消除了在嵌套金字塔中将多个资源请求嵌套在彼此内的需要。

顺便说一句,这不是一个愚蠢的问题!

答案 4 :(得分:0)

回答你的第3部分,

  
      
  1. 有没有办法从csv文件中选择某个列   进口?
  2.   

不,您无法加载CSV的一部分。但是,您可以加载整个CSV文件,并有选择地使用它中的一列。您可以参考data.newVer使用newVer列数据。