生成;表「;使用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'
但由于某些原因,使用@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'
如果有任何改进建议,我将不胜感激

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'

您似乎自己找到了一个有效的解决方案,而不是将其编辑到问题中,请将其作为答案发布,以便我们对其进行表决,您可以在两天后将其标记为接受。您似乎自己找到了一个有效的解决方案,而不是将其编辑到问题中,请将其作为答案发布,以便我们对其进行投票,您可以在两天后将其标记为已接受。谢谢!我真的搞不清楚我是如何在构建阵列之后将其销毁的,但不知怎的我做到了。谢谢你纠正我!谢谢我真的搞不清楚我是如何在构建阵列之后将其销毁的,但不知怎的我做到了。谢谢你纠正我!