***我有一个json文件,其中包含1个数组,包含上千个文档。***我需要将文件转换为csv格式,只需要指定值即可。
每个文档可以有另一个字段或子文档的组合,或者(这就是我的问题),有时字段的值是子文档的数组,在其他情况下,它的值只是subcdoc或字段不存在。
我的目标是提取**. meta.dev.devId**的值(如果字段不存在,则在csv中使用空列。例如,在基本数组中的文档:
1st doc:
{
"docId": "some_hex",
"bin": {
"field": "value",
"length": "123456"
},
"item": "item",
"meta": {
"date": "dateFnc(123456789)",
"name": "name",
"dev": {
"devId": "987654321",
"devName": "name"
},
"type": "type1"
}
}
2nd doc:
{
"docId": "some_hex",
"bin": {
"field": "value",
"length": "123456"
},
"item": "item",
"meta": {
"date": "dateFnc(123456789)",
"name": "name",
"dev": [ {
"devId": "987654321",
"devName": "name"
} ],
"type": "type1"
}
}
3rd doc:
{
"docId": "some_hex",
"bin": {
"field": "value",
"length": "123456"
},
"item": "item",
"meta": {
"date": "dateFnc(123456789)",
"name": "name",
"type": "type1"
}
}
***命令1:**jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev[]?.devId] | @csv' file.json > file.csv
结果1:**无法索引字符串为devId的字符串 *
***命令2:jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev[].devId] | @csv' file.json > file.csv
***结果2:***无法迭代null(null)
***命令3:jq -r '.[] | [.docId, .item, .meta.date, .meta.name, .meta.dev.devId] | @csv' file.json > file.csv
***结果3:****无法索引字符串为devId的数组 *
如何理解命令:
.[]|[. meta.dev.devId] →预期值:“串”
.[]|[.meta.dev[].devId] →预期值:[数组]
.[]|[.meta.dev[]?.devId] →预期值:[array]或不是数组
2条答案
按热度按时间bvjxkvbb1#
您可以遍历到
.meta.dev
,然后使用快捷键objects
和arrays
按类型进行过滤,并结合特定于类型的操作(例如:用arrays[0].devId
提取第一个数组项的字段)。如果.meta.dev
不存在,它将产生null
,因此您可以使用相同的技术来提供默认值(例如nulls | "missing"
)。Demo
或者,您可以使用解构替代运算符
?//
来提供不同的预期结构([{$devId}]
或{$devId}
):Demo
file.csv
的内容:0ve6wy6x2#
当
dev
是一个数组时,可以在type
上使用if-then-else-end
到map()
overdevId
,或者如果不是,则只使用.devId
:使用3个输入文档生成数组:
JqPlay Demo