【问题标题】:Converting CSV to JSON - jQuery将 CSV 转换为 JSON - jQuery
【发布时间】:2018-03-01 00:32:19
【问题描述】:

我正在尝试将数据从 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}};
    });

但无法真正让它工作。我对数据部分很陌生,任何帮助或建议将不胜感激。

提前致谢

【问题讨论】:

    标签: jquery json csv d3.js


    【解决方案1】:

    在这种特殊情况下解析 CSV 格式实际上很简单。请参阅下面的 sn-p。

    我已将主 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);

    【讨论】:

    • 哇!这太酷了。非常感谢,我还有一个疑问,你能帮我吗?
    • 是的,当然。有什么与这个问题有关的吗?
    • 是的,它与这个问题有关,我只是在那里放了一个相同的 CSV。但是我有很多行,我找到了一种使用 d3.js 将它们转换为 JSON 的方法。使用转换后的 JSON,这段代码可以工作吗?
    • 哪个问题?我在您的代码中没有看到任何链接!
    • 你已经回答过我的同一个问题。使用 d3.js 将 CSV 转换为 JSON 后,我将 JSON 输出存储在一个变量中。我可以将 JSON 传递给您现在回答我的代码吗?
    【解决方案2】:

    由于它在 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)
        });
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.2/d3.js"&gt;&lt;/script&gt;

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

    不完整,但我想到了分享。

    【讨论】:

    • 这是我正在玩的一个笨蛋,以防你需要它plnkr.co/edit/jemffA2RHPFjJdSHjz3g?p=preview
    • 您好,谢谢您的回复。但是nested_data 不是我正在寻找的格式。我不希望“键”或“值”出现在那里,而我只想要它的名称。只有“模型”和“链接”。
    • 是的,您接受的答案是更好的出路。使用 d3.nesting 我无法按照您期望的结构进行操作。
    猜你喜欢
    • 2013-08-23
    • 2015-08-23
    • 2019-08-21
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多