d3-fetch和UTF-16 LE

时间:2018-09-17 22:42:04

标签: d3.js promise fetch-api utf-16

我有大量数据,用管道定界的文本文件,我将它们加载到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);
});

但是没什么关系。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

您必须将UTF-16LE解码为Unicode。

我发现了一个小功能https://stackoverflow.com/a/14601808/9938317