如何使用JQ1.4将复杂的JSON转换为CSV
我正在Windows 64位计算机上使用JQ1.4 下面是输入文件如何使用JQ1.4将复杂的JSON转换为CSV,json,jq,Json,Jq,我正在Windows 64位计算机上使用JQ1.4 下面是输入文件IP.txt { "results": [ { "name": "Google", "employees": [ { "name": "Michael", "division": "Engineering" }, { "name": "Laura", "division
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"
}
]
}
]
}
文件包含两个“结果”
。第一个结果包含两家公司的信息:Google
和Microsoft
。第二个结果包含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"
有没有人能指导我在不硬编码索引值的情况下编写脚本
脚本应该能够为任意数量的结果
以及任意数量公司的每个包含信息生成输出
我尝试使用以下未生成预期输出的脚本:
jq -r "[.results[].name,.results[].employees[].name]|@csv" IP.txt
"Google","Microsoft","Michael","Laura","Elise","Brett","David"
"Amazon","Watson"
您需要首先将结果平铺到公司和员工姓名的行中。然后,您可以将其转换为csv行
map(.results | map({ cn: .name, en: .employees[].name } | [ .cn, .en ])) | add[] | @csv
因为您有一个输入流,所以您必须将它吸进(
-s
)。由于您想要输出csv,所以您需要使用原始输出(-r
)。谢谢您,杰夫。这很有效。你能告诉我在哪里可以学习JQ来理解这个脚本是如何工作的吗?我看了JQ手册。它有助于单个过滤器。我想学习如何将它们混合在一起,创造出神奇的解决方案。我能给你的最好建议是了解所有可用的过滤器,了解它们的用途和使用方法。请注意过滤器作为类型生成的内容,是单个值(数字、对象、数组等)还是多个值(使用[]),以及它们如何影响最终结果。有函数式编程或其他声明式编程风格的丰富背景者优先。只要玩玩它,它就会在你身上生长。也许几个月前我才发现这一点,但在这段时间内,我觉得我已经学会了做任何事情。