d3-fetch и UTF-16 LE - PullRequest
       16

d3-fetch и UTF-16 LE

0 голосов
/ 18 сентября 2018

У меня большие объемы данных, текстовые файлы с разделителями каналов, которые я загружаю в 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 () обработал кодировку, но теперь у меня есть эти - �� - обнаружение повсюду, и окончания строк не анализируются должным образом, в результате чего каждая вторая строка результирующих данных содержит все «неопределенные» значения.

После некоторого копания я пытаюсь передать объект init для получения:

d3.text("/data/headers.csv", { headers: { "Content-Type": "text/html, charset=UTF-16" } }).then(function(text) {
    console.log(text);
});

Но это не имеет значения. Любая помощь очень ценится.

1 Ответ

0 голосов
/ 18 сентября 2018

Вы должны декодировать UTF-16LE в Unicode.

Я нашел небольшую функцию https://stackoverflow.com/a/14601808/9938317

...