我的学生信息系统通过电子表格行/列JSON输出自定义列表,列标题作为“name”键的值,数据作为“value”键的值。格式为:
{"count":804,"page":1,"results":{"rows":[{"columns":[{"name":"Student Host ID","value":"1234567890 "},{"name":"Student ID","value":"12345"},{"name":"Student Created","value":"04/27/2017 16:29:40"}]},{"columns":[{"name":"Student Host ID","value":"2345678901 "},{"name":"Student ID","value":"23456"},{"name":"Student Created","value":"04/27/2017 16:29:50"}]}]}}
我想它输出为CSV像:
Student Host ID,Student ID,Student Created
"1234567890","12345","04/27/2017 16:29:40"
"2345678901","23456","04/27/2017 16:29:50"
(but如果JQ喜欢使用引号,我可以使用带引号的头字段名。)我知道我可以在JQ命令中添加实际的字段名,但是我有一堆不同字段的导出,实际的导出可以包含50多个字段,所以我宁愿JQ自动计算头,这样我就可以对不同的文件使用相同的命令。
到目前为止,我有以下方法将数据作为CSV拉取(gsub在一些导出中消除了额外的空格,这些空格似乎会添加到一些字段中,但由于一些奇怪的原因,其他字段中没有添加):
jq -r '.results.rows[] | [.columns[].value] | map(if type=="string" then gsub("^\\s+|\\s+$";"") else . end) | @csv'
这将生成CSV数据:
"1234567890","12345","04/27/2017 16:29:40"
"2345678901","23456","04/27/2017 16:29:50"
我目前使用以下命令获取头的字段名称:
jq -r '.results.rows[0].columns[] | .name' | sed 's/^\|$/"/g'|paste -sd, - | > export.csv
然后运行前面的JQ命令〉〉(追加)数据到同一个export.csv文件。
我见过像https://gist.github.com/gigkokman/bf3b305f1073c176403958628419bb2b这样使用Map自动添加字段名的命令,但我无法理解如何破译命令并将其应用于嵌套的行/列JSON。
我真的很感激你的任何建议-谢谢!
1条答案
按热度按时间jfgube3f1#
像这样组合代码段(从第一行获取标题名称):