jq将jsonlines转换为csv,带有不带slurp报头

t3psigkw  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(94)

具有已知结构的对象的可能巨大的JSON行文件将被转换成具有头部的CSV。
范例

{"name":"name_0","value_a":"value_a_0","value_b":"val_b_0"}
{"name":"name_1","value_a":"value_a_1","value_b":"val_b_1"}
{"name":"name_2","value_a":"value_a_2","value_b":"val_b_2"}
{"name":"name_3","value_a":"value_a_3","value_b":"val_b_3"}
{"name":"name_4","value_a":"value_a_4","value_b":"val_b_4"}

期望产量

"name","value_a","value_b"
"name_0","value_a_0","val_b_0"
"name_1","value_a_1","val_b_1"
"name_2","value_a_2","val_b_2"
"name_3","value_a_3","val_b_3"
"name_4","value_a_4","val_b_4"

正在审理中

(if (input_line_number == 1 ) then ([.|to_entries|.[].key]|@csv) else empty end), 
(.|to_entries|[.[].value]|@csv  )

然而,这依赖于json中的顺序,作为一种替代方法,我将其替换为直接按照我想要的顺序选择值。

(if (input_line_number == 1 ) then ("\"name\",\"value_a\",\"value_b\"") else empty end), (.|[.name?,.value_a?,.value_b?]|@csv  )

jqplay
有没有更好的解决办法?尤其是关于if,因为它感觉很笨重。
我主要不想使用slurp,因为它会将整个文件加载到内存中

pbgvytdp

pbgvytdp1#

别想太多添加一个固定的报头,并使用inputs-n/--null-input来格式化实际内容:

jq -n '["name", "value_a", "value_b"],
(inputs | [.name?, .value_a?, .value_b?])
| @csv' input.json

输出:

"name","value_a","value_b"
"name_0","value_a_0","val_b_0"
"name_1","value_a_1","val_b_1"
"name_2","value_a_2","val_b_2"
"name_3","value_a_3","val_b_3"
"name_4","value_a_4","val_b_4"
chhkpiq4

chhkpiq42#

它不是jq,但我加上它是因为我觉得知道它很有趣。
使用Miller并运行

mlr --j2c cat input.jsonl >output.csv

你得到

name,value_a,value_b
name_0,value_a_0,val_b_0
name_1,value_a_1,val_b_1
name_2,value_a_2,val_b_2
name_3,value_a_3,val_b_3
name_4,value_a_4,val_b_4

相关问题