使用jq将json数据格式化为csv数据
use jq to format json data into csv data
{
"Users": [
{
"Attributes": [
{
"Name": "sub",
"Value": "1"
},
{
"Name": "phone_number",
"Value": "1234"
},
{
"Name": "referral_code",
"Value": "abc"
}
]
},
{
"Attributes": [
{
"Name": "sub",
"Value": "2"
},
{
"Name": "phone_number",
"Value": "5678"
},
{
"Name": "referral_code",
"Value": "def"
}
]
}
]
}
如何生成如下所示的输出?
1,1234,abc
2,5678,def
jq '.Users[] .Attributes[] .Value' test.json
produces
1
1234
abc
2
5678
def
不确定这是处理此问题的最干净的方法,但以下将获得所需的输出:
.Users[].Attributes | map(.Value) | @csv
- 遍历所有深层属性
.Users[].Attributes
map()
获取所有 Value
的
- 转换为
@csv
jqPlay demo
如果您不需要保证输出为 CSV,并且您确定“名称”值以相同的顺序显示,您可以选择:
.Users[].Attributes
| from_entries
| [.[]]
| join(",")
为了安全起见,最好确保排序的一致性:
(.Users[0] | [.Attributes[] | .Name]) as $keys
| .Users[]
| .Attributes
| from_entries
| [.[ $keys[] ]]
| join(",")
使用 join(",")
将生成 Q 中所示的逗号分隔值(不带引号),但保证 不会生成预期的 CSV输入的所有有效值。如果您不介意讨厌的引号,可以使用 @csv
,或者如果您想跳过所有数值周围的引号:
map(tonumber? // .) | @csv
{
"Users": [
{
"Attributes": [
{
"Name": "sub",
"Value": "1"
},
{
"Name": "phone_number",
"Value": "1234"
},
{
"Name": "referral_code",
"Value": "abc"
}
]
},
{
"Attributes": [
{
"Name": "sub",
"Value": "2"
},
{
"Name": "phone_number",
"Value": "5678"
},
{
"Name": "referral_code",
"Value": "def"
}
]
}
]
}
如何生成如下所示的输出?
1,1234,abc
2,5678,def
jq '.Users[] .Attributes[] .Value' test.json
produces
1
1234
abc
2
5678
def
不确定这是处理此问题的最干净的方法,但以下将获得所需的输出:
.Users[].Attributes | map(.Value) | @csv
- 遍历所有深层属性
.Users[].Attributes
map()
获取所有Value
的- 转换为
@csv
jqPlay demo
如果您不需要保证输出为 CSV,并且您确定“名称”值以相同的顺序显示,您可以选择:
.Users[].Attributes
| from_entries
| [.[]]
| join(",")
为了安全起见,最好确保排序的一致性:
(.Users[0] | [.Attributes[] | .Name]) as $keys
| .Users[]
| .Attributes
| from_entries
| [.[ $keys[] ]]
| join(",")
使用 join(",")
将生成 Q 中所示的逗号分隔值(不带引号),但保证 不会生成预期的 CSV输入的所有有效值。如果您不介意讨厌的引号,可以使用 @csv
,或者如果您想跳过所有数值周围的引号:
map(tonumber? // .) | @csv