将CSV转换为JSON - jQuery

时间:2017-09-20 05:08:38

标签: jquery json csv d3.js

我试图将数据从csv转换为json,但我希望数据遵循某种层次结构。

这是我的CSV

link,model,role,access
link1,model1,role1,true
link1,model1,role2,true
link1,model1,role3,true
link1,model1,role4,true
link1,model2,role1,false
link1,model2,role2,false
link1,model2,role3,false
link1,model2,role4,false
link2,model1,role1,false
link2,model1,role2,true
link2,model1,role3,false
link2,model1,role4,true
link2,model2,role1,false
link2,model2,role2,true
link2,model2,role3,false
link2,model2,role4,true

预期结果

"link1": {
    "model1": {
        "role1": true,
        "role2": true,
        "role3": true,
        "role4": true,
    },
    "model2": {
        "role1": false,
        "role2": false,
        "role3": false,
        "role4": false,
    }
},
"link2": {
    "model1": {
        "role1": false,
        "role2": true,
        "role3": false,
        "role4": true,
    },
    "model2": {
        "role1": false,
        "role2": true,
        "role3": false,
        "role4": true,
    }
}

我尝试从jquery - creating nested json from flat json开始,但事情是它只有1级,但在我的情况下它是两个级别。

我想这样做,

data.forEach(function(val) {
        newData[val.link] = {val.model :  {val.role: val.access}};
    });

但无法让它真正发挥作用。我对数据部分很陌生,任何帮助或建议都会非常感激。

提前致谢

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下解析CSV格式实际上非常简单。请参阅下面的代码段。

我已将主要的CSV字符串拆分为\n以获取这些行。现在跳过第一行(即标题),您只需要获取每列的值并将其推送到结果obj



var str = `link,model,role,access
link1,model1,role1,true
link1,model1,role2,true
link1,model1,role3,true
link1,model1,role4,true
link1,model2,role1,false
link1,model2,role2,false
link1,model2,role3,false
link1,model2,role4,false
link2,model1,role1,false
link2,model1,role2,true
link2,model1,role3,false
link2,model1,role4,true
link2,model2,role1,false
link2,model2,role2,true
link2,model2,role3,false
link2,model2,role4,true`;

var lines = str.split('\n');
var obj = {};
// Ignore the first line as it contains only the header info.
for(var i = 1; i < lines.length; i++) {
  var lineItems = lines[i].split(',');
  var link = lineItems[0];
  var model = lineItems[1];
  var role = lineItems[2];
  var roleValue = lineItems[3];
  
  if(obj[link] == undefined) {
    obj[link] = {};
  }
   
  if(obj[link][model] == undefined) {
    obj[link][model] = {};
  }
  
  obj[link][model][role] = roleValue;
}

console.log(obj);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

由于它在d3中被标记,因此d3方式将是这样的:

  • 使用d3.CSV
  • 然后使用d3.nest
  • 汇总值

    d3.csv("https://gist.githubusercontent.com/cyrilcherian/649d692647ddc70afda93be607427221/raw/bbb95b10d1aca62b17f75534039fb7e8a7c911ba/some.csv", function(data) {;
      var nested_data = d3.nest()
        .key(function(d) {
          return d.link;
        })
        .key(function(d) {
          return d.model;
        })
        .rollup(function(leaves) {
          return {
            role1: leaves.find(d => d.role == "role1").access,
            role2: leaves.find(d => d.role == "role2").access,
            role3: leaves.find(d => d.role == "role3").access,
            role4: leaves.find(d => d.role == "role4").access
          };
        })
        .entries(data);
      console.log(nested_data)
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.2/d3.js"></script>

它以键/值方式返回数据,需要根据您的JSON格式进行映射。

不完整但我想分享。