#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"}
]