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

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

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

  2. Adobe Analytics

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

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

  3. Linux

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

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

  4. Google BigQuery

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

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

  5. Adobe Analytics

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

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

  6. Google Cloud Platform

    Google Compute Engine のLinuxVMにVNC接続する

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

最近の記事

  1. GASを利用してWebスクレイピングをやってみよう
  2. Adobe Analyticsを知る。
  3. Cookieを数える -アメリカ、イギリス、オーストラリアの…
  4. Google App Scriptを特定のタイミングで自動で…
  5. Google App ScriptとGoogleスプレッドシ…
  1. IT用語集

    OS(Operating System)って何?
  2. Google Apps Script(GAS)

    Google App ScriptでWebアプリを作る
  3. Google Tag Manager

    GTMの検証でプレビューのSummaryを上手く使う
  4. Adobe Analytics

    続・SafariのITP2.x対策として別サーバー使ってクッキーを永続化する
  5. Google Analytics

    Google Analytics 4: イベントパラメータをセッションスコープで…
PAGE TOP