生成;表「;使用jq从json
从上一个问题中带回我的一个示例数据:生成;表「;使用jq从json,json,export-to-csv,jq,Json,Export To Csv,Jq,从上一个问题中带回我的一个示例数据: { "countries": [ { "countryName": "CZ", "cities": [ { "cityName": "Prague", "streets": [ {
{
"countries": [
{
"countryName": "CZ",
"cities": [
{
"cityName": "Prague",
"streets": [
{
"streetName": "Norská"
},
{
"streetName": "Slovenská"
}
]
}
]
},
{
"countryName": "FR",
"cities": [
{
"cityName": "Paris",
"streets": [
{
"streetName": "rue piat"
},
{
"streetName": "rue lesage"
}
]
}
]
}
]
}
我想使用jq从这些数据生成明文/ascidoc/markdown表,但我缺少一些基本的方法。给定列中的重复项是我没有得到的
因此,预期输出可能如下所示:
CZ Prague Norská
CZ Prague Slovenská
FR Paris rue piat
FR Paris rue lesage
即,如何迭代顶级数组国家
,从中选择字段国家名
,迭代国家
数组元素中包含的字段城市
,并从中选择城市名
,等等,以获得三元组的结果数组,然后将其处理为所需的输出文本
编辑:
- 更新的json与预期的输出数据同步
- 与此同时,我很幸运地表达了自己的观点: jq'.countries[]|。countryName为$country |。cities[]|。cityName为$city |。streets[]|$country+“”+$city+“”+.streetName'
jq '[(.countries[] | .countryName as $country| .cities[] | .cityName as $city | .streets[] | [$country,$city,.streetName])] | @csv' < /tmp/sampleData.json
jq'[(.countries[]|.countryName为$country |.cities[]|.cityName为$city |.streets[][$country,$city,.streetName])]@csv'
如果有任何改进建议,我将不胜感激
EDIT2:为了使@csv工作,必须向它提供数组(它是数组),而不是数组数组。对命令式编程风格的误解。无论如何,这一条是正确的:
jq '[(.countries[] | .countryName as $country| .cities[] | .cityName as $city | .streets[] | [$country,$city,.streetName])] | .[] | @csv' < /tmp/sampleData.json
jq'[(.countries[]|.countryName为$country |.cities[]|.cityName为$city |.streets[].[$country,$city,.streetName])].[]@csv'
您的jq解决方案可以稍微简化,从而提高其效率:
.countries[]
| .countryName as $country
| .cities[]
| .cityName as $city
| .streets[]
| [$country, $city, .streetName]
| @csv
与-r命令行选项结合使用,这当然会生成有效的CSV,但您的Q表示要删除(不必要的?)引号的首选项。对于所示的示例数据,您可以将@csv
替换为连接(“,”
),但一般来说,您必须注意逗号和csv特有的其他字符
一般情况
以下内容似乎适用于一般情况,但依赖于sed来处理有关引号和嵌入换行符的CSV约定,并且尚未经过彻底测试:
< sampleData.json jq -r '
def q:
if type == "string" and test("[,\n\"]")
then tojson
else . end;
.countries[]
| .countryName as $country
| .cities[]
| .cityName as $city
| .streets[]
| [$country, $city, .streetName]
| map(q)
| join(",")
' | sed -e 's/\\\"/""/g' -e 's/\\n/\
/g'
您的jq解决方案可以稍微简化,从而提高其效率:
.countries[]
| .countryName as $country
| .cities[]
| .cityName as $city
| .streets[]
| [$country, $city, .streetName]
| @csv
与-r命令行选项结合使用,这当然会生成有效的CSV,但您的Q表示要删除(不必要的?)引号的首选项。对于所示的示例数据,您可以将@csv
替换为连接(“,”
),但一般来说,您必须注意逗号和csv特有的其他字符
一般情况
以下内容似乎适用于一般情况,但依赖于sed来处理有关引号和嵌入换行符的CSV约定,并且尚未经过彻底测试:
< sampleData.json jq -r '
def q:
if type == "string" and test("[,\n\"]")
then tojson
else . end;
.countries[]
| .countryName as $country
| .cities[]
| .cityName as $city
| .streets[]
| [$country, $city, .streetName]
| map(q)
| join(",")
' | sed -e 's/\\\"/""/g' -e 's/\\n/\
/g'
您似乎自己找到了一个有效的解决方案,而不是将其编辑到问题中,请将其作为答案发布,以便我们对其进行表决,您可以在两天后将其标记为接受。您似乎自己找到了一个有效的解决方案,而不是将其编辑到问题中,请将其作为答案发布,以便我们对其进行投票,您可以在两天后将其标记为已接受。谢谢!我真的搞不清楚我是如何在构建阵列之后将其销毁的,但不知怎的我做到了。谢谢你纠正我!谢谢我真的搞不清楚我是如何在构建阵列之后将其销毁的,但不知怎的我做到了。谢谢你纠正我!