我有大量的数据,管道分隔的文本文件,我加载到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和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()处理了编码,但现在我已经得到了这些 - - 显示遍布整个地方并且行结尾未被正确解析,导致所有其他行的结果数据包含所有“未定义” “价值观。
经过一番挖掘后,我试图传递一个int对象来获取:
d3.text("/data/headers.csv", { headers: { "Content-Type": "text/html, charset=UTF-16" } }).then(function(text) {
console.log(text);
});
但它并没有什么不同。任何帮助非常感谢。
您必须将UTF-16LE解码为Unicode。