[英]how to convert json of this format to csv with jq
我有一个以这种方式格式化的 json 文件:
{"key1": "value1"}
{"key2": "value2"}
{"key3": "value3"}
我想将此 json 转换为 csv。 但是,文件中所有对象的键都不相同。 我有一个所有可能键的列表,但其中一些可能在任何 json object 中丢失。 因此,如果是这种情况,我只想为该列插入一个 null 值。
如何将这种格式的 json 文件转换为我想要的 csv?
更新:这是一个名为 objects.json 的示例文件
{"key1": "value1", "key2": "value2"}
{"key1": "value3", "key2": "value4", "key3": "value5"}
{"key1": "value6", "key2": "value7", "key4": "value8"}
每个 object 都在文件的新行上。
我有一个名为 allkeys.json 的 json 文件,其中包含一个 object ,其中包含所有可能具有 Z37A6259CC0C1DAE299ZDBD86 值的键:
{"key1": null, "key2": null, "key3": null, "key4": null}
我想将 example.json 转换为包含所有列的 CSV 文件,并且对于任何缺少列的对象都有 null 值。
所以我想要的 output 是:
key1,key2,key3,key4
value1,value2,,
value3,value4,value5,
value6,value7,,value8
如果正确理解问题,您可以做的是拥有一个 json 文件,其中所有密钥设置为 null,然后将其与缺少密钥的文件合并。 然后,您将拥有一个包含所有密钥的新 json 文件,稍后您可以像往常一样将其转换为 csv。 这可以使用jq
add
来完成,如下例所示:
echo '{"key1":null}{"key2":null}{"key3":null}{"key4":null}{"key5":null}' > allkeys.json
echo '{"key1":"value1"}{"key2":"value2"}{"key3":"value3"}' > update.json
jq -s add allkeys.json update.json
output:
{
"key1": "value1",
"key2": "value2",
"key3": "value3",
"key4": null,
"key5": null
}
添加转换到 csv:
jq -s add allkeys.json update.json | jq -r '[.[]] | @csv'
output:
"value1","value2","value3",,
我有一个所有可能键的列表
假设此列表可用作 JSON 字符串数组,例如 $keys。 那么使用下面的 jq 过滤器有几个优点,包括效率(不使用 -s 选项)和不丢失数据(相对于 $keys):
$keys, (inputs | [.[$keys[]]]) | @csv
示例用法:
< input.json jq -nr --argjson keys '["key1","key2","key3","key4"]' -f program.jq
"key1","key2","key3","key4"
"value1",,,
,"value2",,
,,"value3",
如果必须从数据中推断出密钥,则可能仍然值得考虑两遍解决方案,因为这样可以避免“破坏”数据。 无论如何,如果采用双通道解决方案,则上述解决方案可以用于第二部分,第一部分如下:
jq -nc 'reduce inputs as $x (null; . + $x) | keys_unsorted' input.json
因此,在类似 bash 的环境中,您将拥有:
<input.json jq -nr \
--argjson keys "$(< input.json jq -nc 'reduce inputs as $x (null; . + $x) | keys_unsorted')" '
$keys, (inputs | [.[$keys[]]]) | @csv
'
您需要读取文件中的所有数据以确定所有对象共有的一组键,然后 output 如果 object 包含这些键和值。 在随后的过程中吞食数据是最容易的。
$ jq -sr '([.[] | keys[]] | unique) as $keys | $keys, (.[] | [.[$keys[]]]) | @csv' input.json
"key1","key2","key3"
"value1",,
,"value2",
,,"value3"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.