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. Google Cloud Platform

    Google Compute Engine のLinuxVMにVNC接続する

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

  2. Google Cloud Platform

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

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

  3. Linux

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

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

  4. Linux

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

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

  5. Adobe Analytics

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

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

  6. Google BigQuery

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

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

最近の記事

  1. 回帰分析はかく語りき Part3 ロジスティック回帰
  2. GCSへのSnowflake Open Catalogによる…
  3. VPC Service Controlsで「NO_MATCH…
  4. モダンデータスタックなワークフローオーケストレーションツール…
  5. Streamlit in Snowflakeによるダッシュボ…
  1. Google Apps Script(GAS)

    文字列置換アプリを作成しました
  2. GA 360 Suite

    BigQuery: Google Analytics 360のネストされたデータ…
  3. フォーム分析

    【Tips】フォーム分析について
  4. Adobe Experience Cloud

    Adobe Summit 2020レポート: Experience Cloud …
  5. 未分類

    databricksのnotebookを使ってみよう その2
PAGE TOP