как разделить одинаковые ключи в первой строке с помощью d3.csv

#javascript #csv #d3.js

#javascript #csv #d3.js

Вопрос:

d3.csv первая строка автоматически распознается как имя ключа. Затем, если первая строка содержит ключи с одинаковыми именами, мы не можем прочитать все данные и d3.csv считываем только один столбец.

пример csv ( Z одинаковые ключи)

 X,Y,Z,Z
1,4,7,10
2,5,8,11
3,6,9,12
  

Я хочу прочитать оба элемента данных, которые соответствуют одним и тем же ключам ( Z в этом примере).
Возможно, мы не можем извлечь «10,11,12» с помощью d3.csv функции.

Не могли бы вы сказать мне, как прочитать оба столбца?

Ответ №1:

Вы правы, что d3.csv не сможете извлечь полные данные.

Однако, если у вас есть пользовательский формат данных, используйте d3.text для загрузки данных в виде текстового файла. Затем вы можете проанализировать его в своем пользовательском формате, используя d3.csv.parseRows.

Это даст вам массив массивов, по которым вы сможете затем d3.transpose найти свои столбцы.

Ответ №2:

Основываясь на ответе @musically_ut, вы могли бы сделать что-то вроде следующего:

 d3.text("txt.csv", function(err, txt){
    var rows = d3.csv.parseRows(txt),
        header = rows.shift(),
        data = rows.map(function(r){
            var obj = {};
            r.forEach(function(c, i){
                if (!(header[i] in obj))
                    obj[header[i]] = c;
                else
                    obj[header[i]]  =  " "   c;
            });
            return obj;
        });
});
  

Здесь, как и в случае с d3.csv , вы создаете объект для каждой строки CSV-файла с ключами, соответствующими именам столбцов. В отличие от d3.csv , если два столбца имеют одинаковое имя, этот метод просто добавляет данные в оба столбца вместе (см. Пример ниже).

Если вы выводите результат data с помощью этого метода, вы получаете следующее:

 >> console.log(JSON.stringify(data));
[{"X":"1","Y":"4","Z":"7 10"},
 {"X":"2","Y":"5","Z":"8 11"},
 {"X":"3","Y":"6","Z":"9 12"}
]