簡體   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