我有大量数据,用管道定界的文本文件,我将它们加载到d3中。数据量足够大,我已经将文件分割成许多10,000行文件。以前,我可以使用d3.queue + d3.text(),然后将其连接到字符串上,然后将其与d3.dsv一起传递。像这样:
d3.queue()
.defer(d3.text, "/data/headers.txt")
.defer(d3.text, "/data/batch1.txt")
.defer(d3.text, "/data/batch2.txt")
.await(function(error, file1, file2, file3) {
if (error) {
console.error('Oh dear, something went wrong: ' + error);
} else {
var allData = file1 + file2 + file3;
var psv = d3.dsvFormat("|");
var parsedData = psv.parse(allData);
}
});
这很好用,但是d3.queue已被删除,并且d3.text现在由Promises and fetch(https://github.com/d3/d3/blob/master/CHANGES.md)作为基础。加载多个文件是通过promises.all完成的。
Promise.all([
d3.text('/data/out1.csv'),
d3.text('/data/batch1.csv'),
d3.text('/data/batch2.csv')
])
.then((vals) => {
let allData;
vals.forEach(d => {
allData = allData + d;
});
var psv = d3.dsvFormat("|");
var parsedData = psv.parse(allData);
});
这似乎在起作用,但是现在我遇到了一个以前没有的编码问题,因为事实证明这些数据都位于UTF-16 LE中(我认为)。以前的d3.text()版本处理了编码,但是现在我得到了这些-��-在所有地方都显示出来,并且行尾未正确解析,导致结果数据的每隔一行包含所有“未定义” “值。
经过一些挖掘后,我试图传递一个初始化对象来获取:
d3.text("/data/headers.csv", { headers: { "Content-Type": "text/html, charset=UTF-16" } }).then(function(text) {
console.log(text);
});
但是没什么关系。任何帮助表示赞赏。