d3-fetch和UTF-16 LE

问题描述 投票:0回答:1

我有大量的数据,管道分隔的文本文件,我加载到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);
});

但它并没有什么不同。任何帮助非常感谢。

d3.js promise fetch-api utf-16
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.