Javascript 将CSV数据映射到新结构中

Javascript 将CSV数据映射到新结构中,javascript,csv,object,d3.js,Javascript,Csv,Object,D3.js,我有一个包含以下数据的csv this_year | minus_one_year | minus_two_year | minus_three_year ------------------------------------------------------------------------- 1 | 2 | 2 | 3 ------------------------------

我有一个包含以下数据的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"
    }
  ]
}
所以对于每一列,我得到的是唯一的值。因此,今年有3个节点,因为数据包含3个唯一值,1、2和4

我使用的是D3,但目前只涉及到解析。对于数据的格式化,我认为我的思路是正确的,我使用的是map

到目前为止,我有类似的东西

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

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

console.log(graph.nodes)
其中输出是csv数据。显然,这不起作用,但是被所有这些映射和减少等弄糊涂了。所以,有了我的数据,我如何才能实现 高于产量

我已经包括了一个例子来展示我到目前为止所做的事情

非常感谢

更新

 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
    });

映射函数参数d没有属性“当前月”和“值”。您的SCV也没有具有此名称的字段。

映射函数参数d没有属性“当前月”和“值”。而且您的SCV也没有具有此名称的字段。

有一种方法可以做到这一点,您必须使用
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)
编辑:您也可以使用类似方式工作的reduce函数

output.reduce(function(acc, line){
    return acc.concat(Object.entries(line).map(function(column){
        return {name: column[0], node: column[1]}
    }))}, [])

这里有一种方法,您必须使用
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)
编辑:您也可以使用类似方式工作的reduce函数

output.reduce(function(acc, line){
    return acc.concat(Object.entries(line).map(function(column){
        return {name: column[0], node: column[1]}
    }))}, [])

csv中的第1行是标题。这必须在节点对象中重复,以适合您的模型。您可以通过循环浏览标题,然后解析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);
var d3=require(“d3”);
let data=“本年,减去一年,减去二年,减去三年\n1,2,2,3,5,5,5,2,2\n4,5,4,4,4,4\n1,2,3”;
让输出=d3.csvParseRows(数据);
设nodeTitles=output[0];
设图={“节点”:[]};
console.log(nodeTitles);
对于(var i=0;i
csv中的第1行是标题。这必须在节点对象中重复,以适合您的模型。您可以通过循环浏览标题,然后解析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);
var d3=require(“d3”);
let data=“本年,减去一年,减去二年,减去三年\n1,2,2,3,5,5,5,2,2\n4,5,4,4,4,4\n1,2,3”;
让输出=d3.csvParseRows(数据);
设nodeTitles=output[0];
设图={“节点”:[]};
console.log(nodeTitles);
对于(var i=0;i
您是否查看了输出:ALL is UNDEFINEDit's undefined,因为它正在访问不存在的键
d.current\u month
d.value
。是否要按唯一值分组?或者只是以节点为例?嗨,它对于每一列都是唯一的,所以它最终会像我的输出一样。抱歉,当前月份应该是今年,正在玩它。您是否查看了输出:ALL is UNDEFINEDit's undefined,因为它正在访问不存在的键
d.current\u month
d.value
。是否要按唯一值分组?或者只是以节点为例?嗨,它对于每一列都是唯一的,所以它最终会像我的输出一样。对不起,本月应该是今年,我正在玩它。谢谢,我已经测试过了,它工作得很好。唯一的问题是它会为每一列复制值。因此,第1年应该只有3个节点(1、2和4),目前它有5个节点,例如@kate_hudson,我已编辑为仅向最终阵列添加唯一项目。谢谢。随机问题,我刚刚发现
csvParseRows
返回一个数组,因为它假设没有头。在我的真实代码中,我读取的不是字符串,而是真实的csv文件,因此使用d3的
csv
函数将事物解析为对象。当我把这段代码应用到那个上面时,它显然不起作用。你知道我需要做什么才能让它和一个物体一起工作吗?谢谢,我已经测试过了,效果很好。唯一的问题是它会为每一列复制值。因此,第1年应该只有3个节点(1、2和4),目前它有5个节点,例如@kate_hudson,我已编辑为仅向最终阵列添加唯一项目。谢谢。随机问题,我刚刚发现
csvParseRows
返回一个数组,因为它假设没有头。在我的真实代码中,我读取的不是字符串,而是真实的csv文件,因此使用d3的
csv
函数将事物解析为对象。当我把这段代码应用到那个上面时,它显然不起作用。你知道我需要做什么才能让它和一个物体一起工作吗?许多感谢这似乎给出了一个非常奇怪的输出,与我所追求的输出不同。例如,是的,当您使用
d3时它会工作。csvParse(数据)
不使用
d3。csvParseRows(数据)
这是两种不同的方法。啊,好的,我现在明白了。我只是举了一个例子,因为我无法在线获得csv。真的,我使用的是
d3.csv('some.csv'