json - 使用 jq 将结构化 JSON 转为 CSV

标签 json csv nested export-to-csv jq

使用jq我尝试将JSON转换为CSV。我的输入 JSON 如下所示:

{
  "rows": [
    {
      "a": ["x","y"],
      "b": "some",
      "c": "string"
    },
    {
      "a": ["u","v"],
      "b": "another",
      "c": "string"
    }
  ]
}

所需的输出如下:

a   | b       | c
x y | some    | string
u v | another | string

编辑: 对于那些提示这不是有效 CSV 的人,请使用符合 RFC 4180 的语法:

a,b,c
x y,some,string
u v,another,string

使用.rows,我成功获取了数组:

[{"a":["x","y"],"b":"some","c":"string"},{"a":["u","v"],"b":"another","c":"string"}]

但是.rows | @csv 说:object ({"a":["x","...) 在 csv 行中无效。所以,我必须以某种方式加入数组键“a”。

使用.rows[] | .a |加入(“”)我得到:

"x y"
"u v"

但是我如何将其返回到我的 JSON 中然后使用 ... | @csv 获取我想要的 CSV 数据?

最佳答案

根据您的输入,以下 程序:

.rows[]
| map_values(if type == "array" then join(" ") else . end)
| [.[]]
| @csv

产生逗号分隔值输出:

"x y","some","string"
"u v","another","string"

添加标题很简单,所以我将其留给您。另外,让我指出,由于您指定了 CSV 输出,因此强烈建议使用 @csv ,但如果出于某种原因您想避免那些有时多余的引号,您可以摆弄字符串 -值以根据需要插入引号,然后使用 join(",") 而不是 @csv

或者,您可能希望将 @tsv 编织到您的解决方案中。

警告

上面的解决方案假设 a/b/c 键始终保持相同的顺序,并且对象没有附加键等。如果安全是一个问题,则只需修改行 [.[] ] 在程序中准确指定您想要的内容。

另请参阅:

有关处理 header 、确保一致性和通用性的一些想法,请参阅:

jq: Object cannot be csv-formatted, only array

关于json - 使用 jq 将结构化 JSON 转为 CSV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307098/

相关文章:

javascript - 使用 jQuery 将 JSON 中的元素转换为 html 不起作用

javascript - 如何从下一个json数组节点获取值

python - 如何使用一个空格字符串清理 CSV 输入?

JavaScript:构造函数实例嵌套在构造的 'wrapper' 中是否有问题?

java - 在嵌套类中创建对象

javascript - 从 json 文件中提取数据

php - 如何将多个对象保存到 MySQL 和 Laravel 中的 JSON 列

java - 如何从SD卡或android中的指定路径读取csv文件

c++ - 为什么 C++ StringStream 跳过输入文件中的第一个数字,但显示其余数字?

list - LISP - 如何获得嵌套列表的平均长度?