用时髦的电子表格行/列嵌套数组将标题添加到CSV的JQ oneliner?

iqjalb3h  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(64)

我的学生信息系统通过电子表格行/列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。
我真的很感激你的任何建议-谢谢!

jfgube3f

jfgube3f1#

像这样组合代码段(从第一行获取标题名称):

jq -r '
  [.results.rows[0].columns[].name], (
    .results.rows[] | [.columns[].value]
    | map(if type=="string" then gsub("^\\s+|\\s+$";"") else . end)
  )
  | @csv
'
"Student Host ID","Student ID","Student Created"
"1234567890","12345","04/27/2017 16:29:40"
"2345678901","23456","04/27/2017 16:29:50"

相关问题