【问题标题】:How to convert complex JSON to CSV using JQ 1.4如何使用 JQ 1.4 将复杂的 JSON 转换为 CSV
【发布时间】:2015-04-21 06:47:10
【问题描述】:

我在 Windows 64 位机器上使用 JQ 1.4。

下面是输入文件IP.txt的内容

{
  "results": [
    {
      "name": "Google",
      "employees": [
        {
          "name": "Michael",
          "division": "Engineering"
        },
        {
          "name": "Laura",
          "division": "HR"
        },
        {
          "name": "Elise",
          "division": "Marketing"
        }
      ]
    },
    {
      "name": "Microsoft",
      "employees": [
        {
          "name": "Brett",
          "division": "Engineering"
        },
        {
          "name": "David",
          "division": "HR"
        }
      ]
    }
  ]
}

{
  "results": [
    {
      "name": "Amazon",
      "employees": [
        {
          "name": "Watson",
          "division": "Marketing"
        }
      ]
    }
  ]
}

文件包含两个"results"。第一个结果包含 2 家公司的信息:GoogleMicrosoft。第二个结果包含Amazon 的信息。 我想将此 JSON 转换为带有公司名称和员工姓名的 csv 文件。

"Google","Michael"
"Google","Laura"
"Google","Elise"
"Microsoft","Brett"
"Microsoft","David"
"Amazon","Watson"

我可以编写以下脚本:

jq -r "[.results[0].name,.results[0].employees[0].name]|@csv" IP.txt

"Google","Michael"

"Amazon","Watson"

有人可以指导我编写脚本而不对索引值进行硬编码吗?

脚本应该能够为任意数量的results 以及任意数量的公司的每个包含信息生成输出。

我尝试使用以下未生成预期输出的脚本:

jq -r "[.results[].name,.results[].employees[].name]|@csv" IP.txt
"Google","Microsoft","Michael","Laura","Elise","Brett","David"
"Amazon","Watson"

【问题讨论】:

    标签: json jq


    【解决方案1】:

    您需要首先将结果平展为公司和员工姓名的行。然后,您可以转换为 csv 行。

    map(.results | map({ cn: .name, en: .employees[].name } | [ .cn, .en ])) | add[] | @csv
    

    由于您有输入流,因此您必须将其灌入 (-s)。由于您要输出 csv,因此您需要使用原始输出 (-r)。

    【讨论】:

    • 谢谢杰夫。这非常有效。你能告诉我在哪里可以学习 JQ 来了解这个脚本是如何工作的吗?我浏览了JQ手册。它有助于单个过滤器。我想学习如何混合它们以创建神奇的解决方案链接您提供的链接。
    • 我能给你的最好建议是了解所有可用的过滤器,并了解它们的用途和用途。请注意过滤器产生的类型,无论是单个值(数字、对象、数组等)还是多个值(使用 [])以及它们如何影响最终结果。函数式编程或其他声明式编程风格的强大背景是一大优势。只要玩它,它就会在你身上生长。我可能几个月前才发现这一点,但在那段时间里,我觉得我已经学到了足够多的东西来做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 1970-01-01
    相关资源
    最近更新 更多