Json 如何使用jq将对象键转换为数组
我正在尝试转换一个csv,其中标题是键,列中的值是列表 例如,我有以下csvJson 如何使用jq将对象键转换为数组,json,csv,jq,csvtojson,Json,Csv,Jq,Csvtojson,我正在尝试转换一个csv,其中标题是键,列中的值是列表 例如,我有以下csv mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4 Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
我想要以下格式
{
"field1" : [Mazda RX4 ,Mazda RX4 Wag,Datsun 710],
"mpg" : [21,21,22.8],
"cyl" : [6,6,6],
"disp" : [160,160,108],
...
}
请注意,未引用数值。我假设所有列都具有相同的类型
我正在使用以下jq
命令
curl https://raw.githubusercontent.com/vincentarelbundock/Rdatasets/master/csv/datasets/mtcars.csv cars.csv | head -n4 | csvtojson | jq '.'
完整工作解决方案
cat | csvtojson | jq'。as$in |将([0]|键_未排序[])减少为$k({};[$k]=($in |映射([k]))
jq播放-将所有数字转换为字符串
这是一个简洁、高效、概念简单的解决方案,它仅基于
map
和reduce
:
. as $in
| reduce (.[0] | keys_unsorted[]) as $k ( {}; .[$k] = ($in|map(.[$k])))
将所有数值字符串转换为数字
这不是相同的转换,但可能会有所帮助:这真的很酷。一个问题。它引用了数字。“field1:[“Mazda RX4”,“Mazda RX4 Wag”],“mpg:[“21”,“21”],“cyl:[“6”,“6”],“disp:[“160”,“160”],`如果字符被引用可以,但是数字不能被引用。如果您想转换整数值字符串,可以使用
tonumber
,但是您没有明确指定这方面的要求(例如,如果原始JSON中的一个键同时具有整数值和非整数值,该怎么办?“简单”?我很想知道你认为什么复杂;JQ-非常有用,但却完全不可理解。也许direct可以更准确地理解我的意思,但由于双行程序实际上只基于两个众所周知的概念(reduce和map),我认为它非常简单,即使语法可能不熟悉。
cat <csv_data> | csvtojson | jq '. as $in | reduce (.[0] | keys_unsorted[]) as $k ( {}; .[$k] = ($in|map(.[$k])))'
. as $in
| reduce (.[0] | keys_unsorted[]) as $k ( {}; .[$k] = ($in|map(.[$k])))
. as $in
| reduce (.[0] | keys_unsorted[]) as $k ( {};
.[$k] = ($in|map(.[$k] | (tonumber? // .))))