【问题标题】:d3-fetch and UTF-16 LEd3-fetch 和 UTF-16 LE
【发布时间】:2019-02-21 21:36:01
【问题描述】:

我有大量数据,管道分隔的文本文件,我正在加载到 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() 处理了编码,但现在我得到了这些 - �� - 出现在所有地方,并且行尾没有被正确解析,导致结果数据的每隔一行都包含所有“未定义" 价值观。

经过一番挖掘,我试图传递一个初始化对象来获取:

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】:

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

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

    【讨论】:

    • 谢谢!仍然得到这个:
    • Uncaught (in promise) DOMException: Failed to execute 'atob' on 'Window': 要解码的字符串包含 Latin1 范围之外的字符。在
    猜你喜欢
    • 2018-05-18
    • 2015-07-14
    • 2020-01-15
    • 2019-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多