将CSV文件转换为JSON数组JS

Converting CSV file to JSON Array JS

本文关键字:JSON 数组 JS 转换 CSV 文件      更新时间:2024-01-19

我有一个sankey图的CSV文件,我想用JSON修改它,因为我的函数使用JSON格式,但我需要从CSV 中读取

CSV文件如下所示:

source,xPos,target,value
user1,0,user2,4
user2,1,user3,4
user1,0,user3,2
user5,user4,2

JSON文件格式应该是这样的,所以我的代码将能够读取它

{
    "nodes":[
        {"node":0,"name":"user0","xPos":0},
        {"node":1,"name":"user1","xPos":0},
        {"node":2,"name":"user2","xPos":1},
    ],
    "links":[
        {"source":0,"target":2,"value":2},
        {"source":1,"target":2,"value":2},
        {"source":1,"target":3,"value":2},
}

忽略名字和链接,因为例子中没有,但这只是一个例子。

没有简单的方法可以做到这一点。您需要实现如下所示的自定义逻辑。

var csv = "source,xPos,target,value'nuser1,0,user2,4'nuser2,1,user3,4'nuser1,0,user3,2'nuser5,user4,2";
var json = csv.split(''n').reduce(function(result, line, index) {
  if (index > 0) { // Skip header.
    var data = line.split(',');
    if (data.length === 4) { // Skip rows with incomplete columns.
      var containsSourceNode = result.nodes.some(function(node) { return node.name === data[0]; });
      if (!containsSourceNode) {
        result.nodes.push({
          node : result.nodes.length,
          name : data[0],
          xpos : data[1]
        });
      }
      var containsTargetNode = result.nodes.some(function(node) { return node.name === data[2]; });
      if (!containsTargetNode) {
        result.nodes.push({
          node : result.nodes.length,
          name : data[2],
          xpos : data[1]
        });
      }
      result.links.push({
        source : result.nodes.filter(function(node) { return node.name === data[0]; })[0].node,
        target : result.nodes.filter(function(node) { return node.name === data[2]; })[0].node,
        value : data[3]
      });
    }
  }
  return result;
}, {
  nodes : [],
  links : []
});
document.body.innerHTML = '<pre>' + JSON.stringify(json, null, 2) + '</pre>';


使用缓存的示例

var csv = "source,xPos,target,value'nuser1,0,user2,4'nuser2,1,user3,4'nuser1,0,user3,2'nuser5,user4,2";
var json = csv.split(''n').reduce(function(result, line, index) {
  if (index > 0) { // Skip header.
    var data = line.split(',');
    if (data.length === 4) { // Skip rows with incomplete columns.
      var containsSourceNode = result.cache[data[0]] != null;
      if (!containsSourceNode) {
        result.nodes.push(result.cache[data[0]] = {
          node : result.size++,
          name : data[0],
          xpos : data[1]
        });
      }
      var containsTargetNode = result.cache[data[2]] != null;
      if (!containsTargetNode) {
        result.nodes.push(result.cache[data[2]] = {
          node : result.size++,
          name : data[2],
          xpos : data[1]
        });
      }
      result.links.push({
        source : result.cache[data[0]].node,
        target : result.cache[data[2]].node,
        value  : data[3]
      });
    }
  }
  return result;
}, {
  nodes : [],
  links : [],
  cache : {},
  size  : 0
});
delete json.cache;
delete json.size;
document.body.innerHTML = '<pre>' + JSON.stringify(json, null, 2) + '</pre>';