2015-05-13 2 views
0

У меня есть вход CSV так:Mapping Excel Столбцы в родитель-ребенок JSON

Column1,Column2,Column3,Column4,Column5 
a,b,c,d,e 
a,b,f,, 
a,g,h,i, 
j,k,l,, 
j,k,m,n, 
o,,,, 

И я пытаюсь превратить это в выходной JSON, который соответствует этому формату (http://bl.ocks.org/mbostock/raw/4063550/flare.json), так что я могу использовать d3.js для визуализации родительского дерева-потомка (http://bl.ocks.org/mbostock/4063570).

Я ищу визуализацию своих данных точно так же, как этот пример, но у меня нет/нужны весы. Если нужно, я могу добавить обычного родителя первого уровня. Просто хочу визуализировать дерево (деревья).

Самая большая глубина всегда 5.

Я играл вокруг с делать некоторые вещи в массив PHP (после чтения с использованием fgetcsv()), но я был неуклюжий вокруг и может использовать некоторую помощь.

Предпочитаемое решение PHP или Javascript, так как это все, с чем я могу работать с помощью моей рабочей настройки компьютера. Я очень ценю помощь!

+0

['d3.nest()'] (https://github.com/mbostock/d3/wiki/Arrays#d3_nest) - это то, что вам нужно для преобразования плоского массива во вложенную структуру. До этого ['d3.csv.parse()'] (https://github.com/mbostock/d3/wiki/CSV#parse) заключается в том, как вы преобразовываете CSV в плоский массив объектов (при условии, что он был загружен уже). – meetamit

+0

@meetamit: Ах, почему я не подумал об этом. Глупый я, и спасибо! – Guest

ответ

1

Похоже, что вы ищете древовидную структуру, где ваши данные выглядит следующим образом:

  a   j  o 
     /\  /
     b g  k 
    /\ \ /\ 
     c f h l m 
    /  \  \ 
    d   i  n 
/
    e 

если да, то следующий код Javascript должен делать то, что вы хотите:

var csv = //CSV CONTENT HERE 
    , data = parseCSV(csv) 
    , structure = toJSONStructure(data) 
    , formattedForD3 = toNameChildFormat(structure) 

console.log(formattedForD3) 

function parseCSV(csv) { 
    return csv.split('\n').slice(1).map(function(line) { 
     return line.split(',') 
    }) 
} 

function toJSONStructure(data) { 
    var structure = {} 
    data.forEach(function(line) { 
     var o = structure 
     line.forEach(function(val) { 
      if(val) o = o[val] = o[val] || {} 
     }) 
    }) 
    return structure 
} 

function toNameChildFormat(structure) { 
    return Object.keys(structure).map(function(key) { 
     return { 
      name:key, 
      children:toNameChildFormat(structure[key]) 
     } 
    }) 
} 

JSFiddle Demo

+0

Трудно изменить это немного, но это сработало! – Guest