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