Javascript 将CSV数据映射到新结构中
我有一个包含以下数据的csvJavascript 将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 ------------------------------
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'