我是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
再次对这个愚蠢的问题感到抱歉,但我对此事的反馈很少。任何帮助将不胜感激。
答案 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
})
答案 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部分,
- 有没有办法从
醇>csv
文件中选择某个列 进口?
不,您无法加载CSV
的一部分。但是,您可以加载整个CSV
文件,并有选择地使用它中的一列。您可以参考data.newVer
使用newVer
列数据。