【问题标题】:flat CSV to nested JSON tree for D3.js平面 CSV 到 D3.js 的嵌套 JSON 树
【发布时间】:2018-05-11 04:56:06
【问题描述】:

我在 CSV 中有大量数据,需要将其转换为嵌套 JSON 以在 D3.js 树中使用。

这是 CSV 数据的示例:

Domain,Subject,Section,Topic
Networking,Networking Communications,Data Transmission,Data - Overview
Networking,Networking Communications,Data Transmission,Email
Networking,Networking Communications,Data Transmission,Datagram
Networking,Networking Communications,Networking Models,OSI Model
Networking,Networking Communications,Networking Models,TCP/IP Mode

这就是 JSON 的外观:

{
    "name":"Networking",
    "groups":["CS Analyst", "Cyber Crime"],
    "children":[
        {
            "name":"Networking Communications",
            "groups":["CS Analyst", "Cyber Crime"],
            "children":[
                {
                    "name":"Data Transmission",
                    "groups":["CS Analyst", "Cyber Crime"],
                    "children":[
                        {
                            "name":"Data - Overview",
                            "groups":["CS Analyst", "Cyber Crime"],
                        },
                        {
                            "name":"Email",
                            "groups":["CS Analyst", "Cyber Crime"],
                        },
                        {
                            "name":"Datagram",
                            "groups":[],
                        }
                    ]
                },
                {
                    "name":"Networking Models",
                    "groups":["CS Analyst"],
                    "children":[
                        {
                            "name":"OSI Model",
                            "groups":["CS Analyst"],
                        },
                        {
                            "name":"TCP/IP Model",
                            "groups":["CS Analyst"],
                        }
                    ]
                },

【问题讨论】:

  • 这不是 CSV。另外,请准确指定标题(第一行)。
  • 您的示例数据看起来不完整 -- "groups":["CS Analyst", "Cyber Crime"] 信息来自哪里?
  • “组”是手动添加的。很抱歉我没有具体说明。只是试图避免手动完成 JSON 的其余部分。
  • @peak 我的评论指的是问题的第一个版本,在编辑之前。

标签: json csv d3.js nested jq


【解决方案1】:

这是一种jq 方法,它通过使用递归来支持无限嵌套。由于不清楚究竟如何计算 groups 值,因此以下程序 (program.jq) 使用固定值。如果你可以指定一个算法来确定这个值,那么应该很容易将它合并到程序中。

理解program.jq的关键是理解group_by(f),它将输入数组项组合成一个数组数组。

program.jq

def gather($supplement):
  group_by(.[0])
  | map( {name: .[0][0]} 
         + $supplement +
         {children: (if (.[0]|length) > 2
                     then (map(.[1:]) | gather($supplement))
                     else map({name:.[1]} + $supplement)
                     end) } )
  ;

split("\n") | map(split(","))
| .[1:] # skip the headers
| map(select(length>0))
| gather({"groups":["CS Analyst", "Cyber Crime"]})
| .[]

调用:

 jq -Rs -f program.jq nested.csv

输出:

  {
    "name": "Networking",
    "groups": [
      "CS Analyst",
      "Cyber Crime"
    ],
    "children": [
      {
        "name": "Networking Communications",
        "groups": [
          "CS Analyst",
          "Cyber Crime"
        ],
        "children": [
          {
            "name": "Data Transmission",
            "groups": [
              "CS Analyst",
              "Cyber Crime"
            ],
            "children": [
              {
                "name": "Data - Overview",
                "groups": [
                  "CS Analyst",
                  "Cyber Crime"
                ]
              },
              {
                "name": "Email",
                "groups": [
                  "CS Analyst",
                  "Cyber Crime"
                ]
              },
              {
                "name": "Datagram",
                "groups": [
                  "CS Analyst",
                  "Cyber Crime"
                ]
              }
            ]
          },
          {
            "name": "Networking Models",
            "groups": [
              "CS Analyst",
              "Cyber Crime"
            ],
            "children": [
              {
                "name": "OSI Model",
                "groups": [
                  "CS Analyst",
                  "Cyber Crime"
                ]
              },
              {
                "name": "TCP/IP Mode",
                "groups": [
                  "CS Analyst",
                  "Cyber Crime"
                ]
              }
            ]
          }
        ]
      }
    ]
  }

【讨论】:

    【解决方案2】:
    var data = [
      "Networking, Networking Communications, Data Transmission, Data-Overview",
      "Networking, Networking Communications, Data Transmission, Email",
      "Networking, Networking Communications, Data Transmission, Something",
      "Networking,  Networking Communications,   Collection Management,   Logs",
      "Networking,  Networking Communications,   Collection Management,   Backups",
      "Networking,  Networking Communications,   Collection Management,   Configuration files",
      "Networking,  Network Architecture,    Architecture Concepts,   Types",
      "Networking,  Network Architecture,    Architecture Concepts,  Design",
      "Networking,  Network Architecture,    Network Topologies,  Comm Medias",
      "Networking,  Network Architecture,    Network Topologies,  Implementations",
      "Networking,  Network Architecture,    Intranet Extranet,  Zoning"
    ]
    
    var arrayToTree = (finalArray, currentArray) => {
      var node
    
      currentArray.forEach((name, index) => {
        const children = index === 0 ? finalArray : node['children']
        let newNode = children.find(child => child.name === name)
    
        if (!newNode) {
          newNode = {
            name,
            ...(
              index < currentArray.length - 1
              ? { children: [] }
              : {}
            )
          }
    
          children.push(newNode)
        }
    
        node = newNode
      })
    
      return finalArray
    }
    
    var finalResult = data.map(row => row.split(/,\s+/)).reduce(arrayToTree, [])
    

    【讨论】:

      猜你喜欢
      • 2013-10-03
      • 2016-04-11
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 2015-05-08
      相关资源
      最近更新 更多