簡體   English   中英

將 CSV 轉換為嵌套的 JSON

[英]Convert CSV to nested JSON

我正在嘗試將以下 CSV 轉換為下面的 JSON。 任何幫助將不勝感激。

CSV 文件示例(文件將包含許多具有網絡、主機屬性的網絡組)

Type,Value ,Name
Network,10.0.0.0/8,network_group_3
Host,10.0.0.27,network_group_3
Host,10.0.0.28,network_group_3
Network,10.10.10.0/24,network_group_4
Network,10.10.20.0/24,network_group_4
Host,10.10.10.6,network_group_4

需要 JSON 格式的輸出

netgroup =
 "literals": [
    {
      "type": "Network",
      "value": "10.0.0.0/8"
    },
    {
      "type": "Host",
      "value": "10.0.0.27"
    },
    {
      "type": "Host",
      "value": "10.0.0.28"
    }
  ],
  "name": "network_group_3"
},
{ 
 "literals": [
    {
      "type": "Network",
      "value": "10.10.10.0/24"
    },
    {
      "type": "Network",
      "value": "10.10.20.0/24"
    },
    {
      "type": "Host",
      "value": "10.0.0.6
    }
  ],
  "name": "network_group_4"

這是將CSV轉換為JSON的Python的很好解釋:

http://www.idiotinside.com/2015/09/18/csv-json-pretty-print-python/

這是使用jq的解決方案

如果文件filter.jq包含

[
  split("\n")                                                  # split string into lines
| (.[0]    | split(",")) as $headers                           # split header
| (.[1:][] | split(","))                                       # split data rows
| select(length>0)                                             # get rid of empty lines
]
| [
      group_by(.[2])[]
    | {
         name:     .[0][2],
         literals: map({type:.[0], value:.[1]})
      }
  ]

並且您的數據在名為data的文件中,然后

jq -M -R -s -r -f filter.jq data

會產生

[
  {
    "name": "network_group_3",
    "literals": [
      {
        "type": "Network",
        "value": "10.0.0.0/8"
      },
      {
        "type": "Host",
        "value": "10.0.0.27"
      },
      {
        "type": "Host",
        "value": "10.0.0.28"
      }
    ]
  },
  {
    "name": "network_group_4",
    "literals": [
      {
        "type": "Network",
        "value": "10.10.10.0/24"
      },
      {
        "type": "Network",
        "value": "10.10.20.0/24"
      },
      {
        "type": "Host",
        "value": "10.10.10.6"
      }
    ]
  }
]

遲到總比沒有好,所以使用convtools庫:

from convtools import conversion as c
from convtools.contrib.tables import Table


# store converter somewhere if it needs to be reused
converter = (
    c.group_by(c.item("Name"))
    .aggregate(
        {
            "literals": c.ReduceFuncs.Array(
                {
                    "type": c.item("Type"),
                    "value": c.item("Value"),
                }
            ),
            "name": c.item("Name"),
        }
    )
    .gen_converter()
)

# iterable of rows and it can only be consumed once
rows = Table.from_csv("tmp2.csv", header=True).into_iter_rows(dict)

assert converter(rows) == [
 {'literals': [{'type': 'Network', 'value': '10.0.0.0/8'},
   {'type': 'Host', 'value': '10.0.0.27'},
   {'type': 'Host', 'value': '10.0.0.28'}],
  'name': 'network_group_3'},
 {'literals': [{'type': 'Network', 'value': '10.10.10.0/24'},
   {'type': 'Network', 'value': '10.10.20.0/24'},
   {'type': 'Host', 'value': '10.10.10.6'}],
  'name': 'network_group_4'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM