我有一个看起来像json的文件:
[
{"start": "xxx", "final": {"name": "uuu", "content": "{'Date': 'Thu, 07 Mar 2019', 'Type': 'text'}"}},
{"start": "yyy", "final": {"name": "nnn", "content": "{'Date': 'Thu, 07 Mar 2019'}"}}
]
"final"
包含一个包含两个键的对象:name
和content
。 content
值是一个对象。它可能为空,并且可能包含不同的键。
但是,我对某些出现在content
中的键感兴趣。在此示例中,如果包括“类型”,我想对其进行解析。如果没有,只需插入“未找到”。
运行此jq
命令时,出现此错误:
jq: error (at <stdin>:4): Cannot index string with string "Type"
这是因为我的json文件中的第二个对象不包含Type
。
有没有解决这个问题的方法?
cat test.json | jq -r '.[] | "\(.start),\(.final["name"]),\(.final["content"]["Type"])"'
jq: error (at <stdin>:4): Cannot index string with string "Type"
答案 0 :(得分:1)
由于map(.final.content |= (gsub("'";"\"") | fromjson))
| .[]
| "\(.start),\(.final["name"]),\(.final["content"]["Type"])"
无法直接处理“ content”字段的值,因此以下解决方案首先将单引号转换为转义的双引号,然后应用过滤器:
xxx,uuu,text
yyy,nnn,null
使用-r命令行选项输出:
@csv
如果您想获得有效的CSV输出,最好使用.[]
| .final.content |= (gsub("'";"\"") | fromjson)
| [.start, .final["name"], .final["content"]["Type"]]
| @csv
过滤器:
jq -r -f program.jq test.json
将jq程序保存在文件中,例如program.jq,相应的调用将如下所示:
//
如果您要专门处理缺失值,可以使用(.final["content"]["Type"] // "NA")
,例如:
.final.content |= (gsub("\"";"\\\"") | gsub("'";"\"") | fromjson)
my_array = ['€110.5M', '€111.5M', '€112.5M']
my_cleaned_array = []
for elem in my_array:
my_cleaned_array.append(elem.replace('€', '').replace('M', ''))