コマンドラインでjqを使用してJSONをCSVに変換する方法

シェルツールjqは、JSONデータを処理するのに最適です。また、そのデータを便利なCSVファイルに変換して、スプレッドシートのラングリングのすべてのニーズに対応することもできます。

jqは端末に常駐し、JSONデータで便利な処理を実行する優れた小さなツールです。これは強力なツールですが、ささいなことにも便利です。たとえば、JSONデータをパイプ処理すると、構文が強調表示されて出力されますか?デフォルト:

$ cat some-data.json|jq

ほとんどのシステムにjqをインストールできます。(brew install jq自作のMacの場合/chocolatey install jqチョコレートのようなウィンドウの場合)。この投稿では、より高度なjq手法を紹介します。基本を知りたい場合は、チュートリアルを確認してください。

jq任意のJSONソースで動作します。私はほとんどの日をSanity.ioベースのバックエンドで作業しているので、それを例として使用します。また、この組み合わせでできることは非常にクールだと思うからです。

Sanityは、構造化コンテンツのバックエンドであり、リアルタイムAPIとGROQと呼ばれるクエリ言語が付属しています。HTTPおよびJS / PHPクライアントを介してSanityと対話できますが、$ sanity documents query 'GROQ-expression'。を使用してCLIツールと対話することもできます。

したがって、このタイプのドキュメントがpost必要な場合は、を配置し$ sanity documents query '*[_type == "post"]'ます。または、2018年に公開日が必要な場合は、$ sanity documents query '*[_type == "post" && publishedAt > "2018-01-01「]」です。このクエリを使用すると、ドキュメント全体が表示されます。タイトルと公開日だけが必要な場合は、e: *[_type == "post"]{title, publishedAt}と記述します。

JSONデータからキーと値を選択することもできjqます。今日は、これを使用して、JSON配列の構造化コンテンツをCSVファイルに変換します。上司がExcelシートのものを欲しがっているからですよね?しっかり座って、飛び込みましょう!?‍

ブログエントリのタイトル、スラッグ、公開日のリストをスプレッドシートに入れたいとしましょう。式全体は次のようになります。

sanity documents query '*[_type == "post"]{title, "slug": slug.current, publishedAt}'|jq -r '(map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $cols, $rows[] | @csv'

これをコピーして実行するか、jqplay.comで再生できますが、-expressionで何が起こっているかを見てみましょうjq

  • -r--raw-ouput、出力が色や特別なフォーマットのないプレーンで古い退屈なテキストであることを確認するためのものです。
  • (map(keys) | add | unique) as $cols繰り返し処理(mapあなたのオブジェクトのキーとを介して)addSuniqueと呼ばれる変数へのもの$cols。つまり、これが列ヘッダーの作成方法です。
  • map(. as $row | $cols | map($row[.])) as $rows外側の配列内のすべてのオブジェクトを取得し、すべてのオブジェクトキー(title、slug、publishedAt)を反復処理します。配列に値を追加します。これにより、値を含む配列の配列が得られます。これは、JSONをCSVに変換するときに必要なものです。
  • $cols, $rows[] | @csv列ヘッダーを最初に配列に配置し、次に@csv、それらをにパイプすることによって行に変換される各配列を配置します。これにより、出力が…csvとしてフォーマットされます。

このコマンドは、結果をシェルに出力します。ファイルに直接書き込みたい場合は、> filename.csvをファイルに追加するか、たとえばクリップボードに追加できます(to | pbcmacOSを使用している場合はopyをパイプします)。または、パンダのcsvで何かエキサイティングなことをするかもしれませんか?Pythonで?

これがお役に立てば、コメントセクションですべてお聞きしたいと思います。

Sanity.ioを試してみたい場合は、sanity.io / freecodecampにアクセスして、無料の開発者プランを入手できます。✨

もともとsanity.ioで公開されました。