こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
新型コロナウイルスによる外出自粛の中、せっかくなのでこの時間を使ってLinuxのコマンドラインを勉強しましょう。
コマンドラインでササっとJSONファイルをCSVファイルに変換出来るとイザという時に役立ちます。(弊社調べ)
まずは対象となるデータですが、Linuxのコンソールからコロナウイルスの状況を確認する方法があるのでこれを使います。
curlというCLIのHTTPクライアントを使います。
Coronavirus Tracker
Coronavirs Trackerは、世界中のCOVID-19の感染状況の数字をテキストで表示してくれるサービスです。
$ curl https://corona-stats.online/
このように表示されます。
なお、日本だけに絞りたい場合はこうです。
国名で絞れます。
$ 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が大好きなマーケティングテクノロジスト/データエンジニアが複数在籍しております。
お問い合わせはこちらからどうぞ。