我有以下 JSON 文件:
{ data : [
{
"name" : "name1"
"date" : [
{
"date1" : "aaa",
"date2" : "bbb"
},
{
"date1" : "ccc",
"date2" : "ddd"
},
{
"date1" : "eee",
"date2" : "fff"
},
"var" : "ggg"
},
{
"name" : "name2"
"date" : [
{
"date1" : "hhh",
"date2" : "iii"
},
{
"date1" : "jjj",
"date2" : "kkk"
},
"var" : "lll"
}
]
}
我想要这种格式的 CSV 文件:
name, date, var
name1, aaa ccc eee, ggg
name2, hhh jjj, lll
仅使用jq可以做到这一点吗?
假设您的 JSON 文档格式正确,例如您呈现的文本的以下修改变体:
然后我们可以执行以下操作:
jq
表达式,用更多的空气来显示结构:这首先将 CSV 标头创建为字符串数组。然后它遍历顶层
data
数组,将name
和var
键的值提取到一个数组中。它还挑选出数组date1
中子键的所有值date
,并将它们与空格连接起来作为分隔符。然后使用 CSV 标头数组以及为每个
data
元素构造的数组进行处理以输出@csv
,它引用每个字符串并用逗号分隔元素。另一种变体:
这会预处理数据,以便第一个管道之后的表达式部分获得以下输入:
第一个管道之后的代码只需提取 CSV 标头的键,然后收集值,而不必担心键的名称。
再一次,
jq
为了说明而插入了一点 mor 空气的表达式:时髦的外观
.data[] | [.[]]
创建了每个元素中所有键的值的数组data
。如果担心
.[]
应用于非数组可能会以与keys
产生的顺序不同的顺序提取值,那么可以使用即,将标题键提取到变量
$keys
中,使用它来创建 CSV 标题并data
从数组中的元素中提取数据。列可能是随机顺序,但至少标题和其余数据是相同的随机顺序,CSV 解析器按名称提取列没有问题。