尝试使用 jq 将 json 转换为 csv

尝试使用 jq 将 json 转换为 csv

我似乎不知道如何使用 jq 将我的数据转换为 csv。我有以下 json:

    {
  "id": 2,
  "type": "message",
  "date": "2010-01-11T01:19:45",
  "edited": "1969-12-31T19:00:00",
  "from": "USER1",
  "from_id": 5514,
  "text": "Message1"
 },
 {
  "id": 3,
  "type": "message",
  "date": "2010-01-11T01:19:28",
  "edited": "1969-12-31T19:00:00",
  "from": "USER2",
  "from_id": 5515,
  "text": "Message2"
 },
 {
  "id": 4,
  "type": "message",
  "date": "2010-01-11T01:19:28",
  "edited": "1969-12-31T19:00:00",
  "from": "USER1",
  "from_id": 5514,
  "text": "Message3"
 },

我试图从 json 中获取日期、来源和文本,并将其输出到 csv 中,如下所示:

From,Date,Text
USER1,2010-01-11T01:19:45,Message1
USER2,2010-01-11T01:19:28,Message2
USER1,2010-01-11T01:19:28,Message3

有没有办法用 jq 做到这一点,或者使用不同的东西会更好吗?

答案1

它是

<input.json jq --raw-output '.[]|[.from,.date,.text]|@csv'

答案2

如果您希望能够动态选择要提取的密钥,并且还希望在输出文档的 CSV 标头中使用这些密钥,您可以在命令行上传递它们,如下所示jq

jq -r '$ARGS.positional, map([.[$ARGS.positional[]]])[] | @csv' file --args date from

这会传递到表达式dateand 。在表达式中,这些字符串将在数组中找到。该表达式首先使用此数组来创建标题标签数组(键本身)。然后它使用数组元素作为键从 中的输入数据中提取相应的值。然后使用运算符将​​标题和数据转换为正确引用的 CSV 输出。fromjq$ARGS.positionalfile@csv

给定问题中的数据,上述命令将生成以下输出(假设将 JSON 片段放入数组中并删除最后一个逗号):

"date","from"
"2010-01-11T01:19:45","USER1"
"2010-01-11T01:19:28","USER2"
"2010-01-11T01:19:28","USER1"

--args from date text代替--args date from,你会得到

"from","date","text"
"USER1","2010-01-11T01:19:45","Message1"
"USER2","2010-01-11T01:19:28","Message2"
"USER1","2010-01-11T01:19:28","Message3"

jq始终引用所有 CSV 输出字段。


您还可以使用以下命令轻松获得相同类型的输出磨坊主( mlr):

$ mlr --j2c cut -f from,date,text file
date,from,text
2010-01-11T01:19:45,USER1,Message1
2010-01-11T01:19:28,USER2,Message2
2010-01-11T01:19:28,USER1,Message3

在这里,我们要求mlr剪切(提取)名为fromdate和的字段text。使用单个选项将输入从 JSON 转换为 CSV --j2c

Miller 只会引用需要引用的 CSV 字段。

相关内容