繁体   English   中英

如何使用 jq 将此格式的 json 转换为 csv

[英]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
   

Output

"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"

jqplay

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM