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. Adobe Analytics

    Adobe Analytics: データフィードをGoogle Compute EngineのLin…

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

  2. Google BigQuery

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

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

  3. Google Cloud Platform

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

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

  4. Google Cloud Platform

    Google Compute EngineのUbuntu VMにスワップ領域を作成する

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

  5. Linux

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

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

  6. Linux

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

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

最近の記事

  1. LangChainって何?: 次世代AIアプリケーション構築…
  2. 回帰分析はかく語りき Part1 単回帰分析
  3. GitHub ActionsでGCEへのデプロイを楽にしてみ…
  4. Snowflake の Copilot が優秀すぎる件につい…
  5. Snowflake の新しいData Clean Roomの…
  1. Tableau

    【図解】Tableau Desktop 2020.2の新機能をはじめから丁寧に(…
  2. Adobe Analytics

    Adobe AnaltyicsとGoogle Analytics の「生Webビ…
  3. Tableau

    【図解】Tableau Desktop 2020.3で「計算式」「予測機能」など…
  4. Tableau

    【TC19ブログ】エクスチュアの海外カンファレンス参加支援制度
  5. ヒートマップ

    アテンション・ヒートマップ
PAGE TOP