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 BigQuery

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

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

  2. Adobe Analytics

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

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

  3. Linux

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

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

  4. Google Cloud Platform

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

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

  5. Google Cloud Platform

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

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

  6. Adobe Analytics

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

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

最近の記事

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

    Web解析ツールだけでは足りない – その2
  2. Google Cloud Platform

    VPC Service Controlsで「NO_MATCHING_ACCESS…
  3. IT用語集

    アベイラビリティ(Availability)って何?
  4. Adobe Analytics

    Adobe AEP SDKでReactNativeアプリを計測する (Andro…
  5. Tableau

    TableauでTreasure Data上のデータへ接続する方法(2019/1…
PAGE TOP