Linux

Linux Tips: コマンドラインでJSONをCSVに変換する

こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。

新型コロナウイルスによる外出自粛の中、せっかくなのでこの時間を使ってLinuxのコマンドラインを勉強しましょう。
コマンドラインでササっとJSONファイルをCSVファイルに変換出来るとイザという時に役立ちます。(弊社調べ)

まずは対象となるデータですが、Linuxのコンソールからコロナウイルスの状況を確認する方法があるのでこれを使います。
curlというCLIのHTTPクライアントを使います。

Coronavirus Tracker

Coronavirs Trackerは、世界中のCOVID-19の感染状況の数字をテキストで表示してくれるサービスです。

$ curl https://corona-stats.online/

このように表示されます。

curlコマンドでコロナウイルスデータを取得

なお、日本だけに絞りたい場合はこうです。
国名で絞れます。

$ curl https://corona-stats.online/Japan

 

JSON形式で保存

そしてこのサービスはテキスト表示だけではなく、JSONフォーマットでの出力も対応しています。
というわけでJSONファイルとしてこのデータを保存しましょう。

$ curl https://corona-stats.online/?format=json -o corona.json

これでcorona.jsonという名前でJSONが保存されます。

 

jqコマンドで整形してCSV化

つづいてjqコマンドを使います。
jqコマンドはコマンドラインでJSONを扱える便利ツールです。
そして、配列データであればCSVにも変換出来るスグレモノです。

Ubuntuならばaptでインストール出来ます。

$ sudo apt install -y jq

というわけでまずはせめて見た目をキレイにしたい場合はこうします。

$ cat corona.json | jq -r '.'

出力結果はこうなります。

{
  "data": [
    {
      "updated": 1586920975566,
      "country": "USA",
      "countryInfo": {
        "_id": 840,
        "iso2": "US",
        "iso3": "USA",
        "lat": 38,
        "long": -97,
        "flag": "https://raw.githubusercontent.com/NovelCOVID/API/master/assets/flags/us.png"
      },
      "cases": 613886,
      "todayCases": 0,
      "deaths": 26047,
      "todayDeaths": 0,
      "recovered": 38820,
      "active": 549019,
      "critical": 13473,
      "casesPerOneMillion": 1855,
      "deathsPerOneMillion": 79,
#以下略

さてここからが本題。
このJSONファイルのdata要素の中にある、country, cases, todayCases,… などのキーに含まれる値を並べてCSVにしたい。

そういう場合はこうします。

$ cat corona.json |jq -r '.data[]|[.country, .cases, .todayCases, .deaths, .todayDeaths, .recovered, .active, .critical, .casesPerOneMillion, .deathsPerOneMillion, .tests, .testsPerOneMillion, .confirmed, .countryCode]|@csv'

出力はこうなります。

"USA",613886,0,26047,0,38820,549019,13473,1855,79,3065019,9260,613886,"US"
"Spain",174060,0,18255,0,67504,88301,7371,3723,390,600000,12833,174060,"ES"
"Italy",162488,0,21067,0,37130,104291,3186,2687,348,1073689,17758,162488,"IT"
"France",143303,0,15729,0,28805,98769,6730,2195,241,333807,5114,143303,"FR"
"Germany",132210,0,3495,0,68200,60515,4288,1578,42,1317887,15730,132210,"DE"
"UK",93873,0,12107,0,0,81422,1559,1383,178,382650,5637,93873,"GB"
"China",82295,46,3342,1,77816,1137,113,57,2,0,0,82295,"CN"
"Iran",74877,0,4683,0,48129,22065,3691,891,56,287359,3421,74877,"IR"
"Turkey",65111,0,1403,0,4799,58909,1809,772,17,443626,5260,65111,"TR"
"Belgium",31119,0,4157,0,6868,20094,1223,2685,359,102151,8814,31119,"BE"
#以下略

キレイにCSVに変換されました!
マジ便利。

jqコマンドの-rオプションの中で何をやってるかと言うと、まずは
.data[]
の部分でdataという配列要素の中身を取り出してます。

その結果の各要素を取り出して配列で並べてます。
それが
|[.country, …, .countryCode]
の部分です。

そして最後に、
|@csv
のところでCSV化してます。

 

おまけ: rsコマンドでCSVを縦横変換

CSVを縦横変換したい!というケースがたまにあります。
そういう時はrsコマンドでサクッと変換してしまいましょう。

Ubuntuならばaptでインストール出来ます。

$ sudo apt install -y rs

使い方はこうです。
-cオプションでinputファイルのデリミタ、-Cオプションがアウトプットのデリミタ、で-Tが縦横変換です。

$ cat corona.csv |rs -c, -C, -T

"USA","Spain","Italy","France","Germany","UK","China","Iran","Turkey","Belgium",
613886,174060,162488,143303,132210,93873,82295,74877,65111,31119,
0,0,0,0,0,0,46,0,0,0,
26047,18255,21067,15729,3495,12107,3342,4683,1403,4157,
0,0,0,0,0,0,1,0,0,0,
38820,67504,37130,28805,68200,0,77816,48129,4799,6868,
549019,88301,104291,98769,60515,81422,1137,22065,58909,20094,
13473,7371,3186,6730,4288,1559,113,3691,1809,1223,
1855,3723,2687,2195,1578,1383,57,891,772,2685,
79,390,348,241,42,178,2,56,17,359,
3065019,600000,1073689,333807,1317887,382650,0,287359,443626,102151,
9260,12833,17758,5114,15730,5637,0,3421,5260,8814,
613886,174060,162488,143303,132210,93873,82295,74877,65111,31119,
"US","ES","IT","FR","DE","GB","CN","IR","TR","BE",

おおお、これまた便利ですね。
「いや、そこはawk使えよ!」という方はぜひawkで実装してください。

エクスチュアにはLinuxが大好きなマーケティングテクノロジスト/データエンジニアが複数在籍しております。
お問い合わせはこちらからどうぞ

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Linux

    Linux技術者資格のLPIC-3試験に合格しました

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。長いこ…

  2. Google Cloud Platform

    Google Compute Engine: 一定時間経過したらタスクを強制終了する

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

  3. Google Cloud Platform

    Google Compute Engine のLinuxVMにVNC接続する

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

  4. Linux

    無料のWindows10仮想マシンをEdge/IE11検証用途で使う

    こんにちは、エクスチュアの権泳東(コン・ヨンドン)です。普段W…

  5. Google BigQuery

    オープンソースBI「Metabase」の使い勝手が丁度良かった

    こんにちは、エクスチュアの權泳東(コン・ヨンドン)です。ほんの…

  6. Adobe Analytics

    Adobe AEP SDK: リバースプロキシを使ったアプリ計測検証方法

    こんにちは、エクスチュアの權泳東(コン・ヨンドン)です。Ado…

最近の記事

  1. モダンデータスタックなワークフローオーケストレーションツール…
  2. Streamlit in Snowflakeによるダッシュボ…
  3. Streamlit in SnowflakeによるStrea…
  4. Streamlitを使った簡単なデータアプリケーション作成ガ…
  5. 生成AI機能を活かしたデータカタログ製品「Secoda」を試…
  1. ObservePoint

    タグ監査ツールとは? 〜〜出来ることと導入のメリット〜〜
  2. IT用語集

    プロパティ(Property)って何?
  3. Tableau

    ツールヒントの中にVizを埋め込む理由・方法
  4. Adobe Analytics

    BigQuery: テーブルに格納されたURL文字列をKey-ValueのSTR…
  5. Mouseflow

    Mouseflowで問題解決① -事例ベースで機能紹介-
PAGE TOP