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

これはand式に渡されますdate。式では、これらの文字列は配列にあります。式は最初にこの配列を使用してタイトルタグ(キー自体)配列を作成します。次に、配列要素をキーとして入力データから対応する値を抽出します。その後、演算子を使用してヘッダーとデータを正しく引用された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というフィールドを切り取り(抽出)するように要求します。単一のオプションを使用して入力をJSONからCSVに変換します。fromdatetext--j2c

Millerは引用符が必要なCSVフィールドのみを引用します。

関連情報