Отображение данных CSV в новую структуру - PullRequest
0 голосов
/ 11 января 2019

У меня есть CSV, который содержит следующие данные

this_year   |   minus_one_year  |   minus_two_year  |   minus_three_year
-------------------------------------------------------------------------
1           |   2               |   2               |   3
-------------------------------------------------------------------------
4           |   5               |   5               |   5
-------------------------------------------------------------------------
2           |   2               |   2               |   2
-------------------------------------------------------------------------
4           |   5               |   4               |   4
-------------------------------------------------------------------------
1           |   2               |   3               |   3
-------------------------------------------------------------------------

Я прочитал этот CSV-файл, и теперь мне нужно организовать данные. Моя конечная цель - получить следующий вывод

{
  "nodes": [
    {
      "name": "1",
      "node": "this_year"
    },
    {
      "name": "2",
      "node": "this_year"
    },
    {
      "name": "4",
      "node": "this_year"
    },
    {
      "name": "2",
      "node": "minus_one_year"
    },
    {
      "name": "5",
      "node": "minus_one_year"
    },
    {
      "name": "2",
      "node": "minus_two_year"
    },
    {
      "name": "3",
      "node": "minus_two_year"
    },
    {
      "name": "4",
      "node": "minus_two_year"
    },
    {
      "name": "5",
      "node": "minus_two_year"
    },
    {
      "name": "2",
      "node": "minus_three_year"
    },
    {
      "name": "3",
      "node": "minus_three_year"
    },
    {
      "name": "4",
      "node": "minus_three_year"
    },
    {
      "name": "5",
      "node": "minus_three_year"
    }
  ]
}

Итак, для каждого столбца я получаю уникальные значения. Таким образом, this_year имеет 3 узла, поскольку данные содержат 3 уникальных значения: 1, 2 и 4.

Я использую D3, но на данный момент это связано только с анализом. Для форматирования данных, я думаю, я на правильном пути, я использую карту.

Пока у меня есть что-то вроде этого

let graph = {"nodes" : [], "links" : []};

graph.nodes = output.map(function(d) { return [
  {
    'name': d.current_month,
    'node': d.value
  }
]; });

console.log(graph.nodes)

Где вывод - данные CSV. Очевидно, что это не работает, но становится немного запутанным из-за всего этого картирования, сокращения и т. Д. Итак, с данными, которые у меня есть, как я могу достичь выше вывода?

Я включил JSFiddle , чтобы продемонстрировать, что я сделал до сих пор.

Большое спасибо

UPDATE

 d3.csv('churn_status.csv')
    .then(function(data) {

        vm.graph.nodes = data.reduce(function(acc, line){
            return acc.concat(Object.entries(line).map(function(column){
                return {name: column[0], node: column[1]}
            }))}, []);


        vm.graph.nodes = vm.graph.nodes.sort(function(a,b) { return a.name > b.name ? -1 : 1});
    })
    .catch(function(error){
        // handle error
    });

Ответы [ 3 ]

0 голосов
/ 12 января 2019

Вот один из способов сделать это: вам нужно разбить строки на ключ / значение, используя Object.entries(), а затем отправить новые объекты в узлы.

Примечание Object.entries({a:100}) возвращает массив ["a", 100]

let graph = {"nodes" : [], "links" : []};

output.forEach(function(line) { 
    Object.entries(line).forEach(function(column){
      graph.nodes.push({
         'name': column[0],
         'node': column[1]
      })
  })
})
console.log(graph.nodes)

Редактировать: вы также можете использовать функцию уменьшения, которая работает аналогичным образом

output.reduce(function(acc, line){
    return acc.concat(Object.entries(line).map(function(column){
        return {name: column[0], node: column[1]}
    }))}, [])
0 голосов
/ 12 января 2019

Строка 1 в вашем CSV является названиями. Это должно быть повторено в объекте узла в соответствии с вашей моделью. Этого можно добиться, просматривая заголовки и анализируя оставшуюся часть файла CSV:

var d3 = require("d3");
let data = "this_year,minus_one_year,minus_two_year,minus_three_year\n1,2,2,3\n4,5,5,5\n2,2,2,2\n4,5,4,4\n1,2,3,3";

let output = d3.csvParseRows(data);
let nodeTitles = output[0];
let graph = {"nodes" : []};

console.log(nodeTitles);

for (var i = 0; i < nodeTitles.length; i++) {
    for (var j = 1; j < output.length; j++)
    {
        var obj = {name:output[j][i], node:nodeTitles[i]}; 
        if (!graph.nodes.some(function(element) {
            return (element.name == output[j][i]) && (element.node == nodeTitles[i]);
          }))
        {
            graph.nodes.push(obj);
        }
    }
}
console.log(graph);
0 голосов
/ 12 января 2019

параметр функции карты d не имеет свойств "current_month" и "value". И у вашего SCV также нет полей с этим именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...