[英]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.