我似乎不知道如何使用 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
这会传递到表达式date
and 。在表达式中,这些字符串将在数组中找到。该表达式首先使用此数组来创建标题标签数组(键本身)。然后它使用数组元素作为键从 中的输入数据中提取相应的值。然后使用运算符将标题和数据转换为正确引用的 CSV 输出。from
jq
$ARGS.positional
file
@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
剪切(提取)名为from
、date
和的字段text
。使用单个选项将输入从 JSON 转换为 CSV --j2c
。
Miller 只会引用需要引用的 CSV 字段。