JSONファイルを文字列置換でCSV形式に変換してみた
今回は豆知識レベルか少し疑問ですが、Linux(CentOS7)環境でJSONファイルをCSV形式に変換する作業風景をご紹介します。
Linuxは馴染みのない方も多いかも知れませんが、Macでも類似の処理ができます。全くそのまま使える訳ではありませんが、興味ある方の調べるきっかけになれば幸いです。
今回の題材
為替情報(JSON)を提供してくれるAPIがあります。
https://api.exchangeratesapi.io/latest
今回はこのレスポンスをCSVに変換してみます。
変換前(JSON)のイメージ
{"rates":{"CAD":1.5336,"HKD":8.7396,"ISK":159.0,"PHP":55.794,"DKK":7.4483,"HUF":353.7,"CZK":26.691,"AUD":1.6247,"RON":4.8428,"SEK":10.398,"IDR":16276.91,"INR":84.841,"BRL":6.0691,"RUB":80.2104,"HRK":7.5345,"JPY":120.48,"THB":35.316,"CHF":1.0625,"SGD":1.5703,"PLN":4.4743,"BGN":1.9558,"TRY":7.7417,"CNY":7.8952,"NOK":10.7163,"NZD":1.7189,"ZAR":19.0889,"USD":1.1276,"MXN":25.6953,"ILS":3.9006,"GBP":0.8957,"KRW":1354.7,"MYR":4.8109},"base":"EUR","date":"2020-07-10"}
変換後(CSV)のイメージ
日付を1行目に表示して、2行目以降で通貨名とレートを2列で表示しようと思います。
2020-07-10
CAD,1.5336
HKD,8.7396
...
MYR,4.8109
為替情報(JSON)の取得
データの取得にはcurlコマンドというものを使います。
改行はありませんが、ブラウザで見たのと同じように為替情報(JSON)が取得できました。
このレスポンスをファイルに書き込みます。ファイル名は response としておきます。
一応ファイルの中身の確認もしています、問題ありませんね。
日付部分の抽出
ではこのファイルから日付部分を抽出します。
今回は文字列置換で抽出します。文字列の置換にはsedコマンドというものを使います。
"date":"2020-07-10" の右側だけがほしいので、その他の部分は全部削除する置換をします。
これで日付部分が取得できました。
ややこしく見えるので少しだけ解説します。
sedコマンドで正規表現を使って文字を置き換えることができます。
置換対象になる部分を表すパターンが
.*"date":"\([^"]*\).*
です。
何に置き換えるかを指定しているのが
\1\n
です。
このように指定することで「2020-07-10」の部分だけ取り出すことができます。(さらに詳しく知りたい方向け キーワード: sed 正規表現 後方参照)
通貨レート部分の抽出
次に通貨の部分を抽出します。
日付と同様に
"rates":{"CAD":1.5336,"HKD":8.7396,...,"MYR":4.8109}の右側だけほしいので、その他の部分は全部削除する置換をします。
これで抽出はできました。ここからさらに「,」の位置で改行したいので、さきほどのコマンドに
-e 's/,/\n/g'
を追加します。
さらに「:」はカンマにしたいので、
-e 's/:/,/g'
を追加します。
また、「"CAD":1.5336」の左側を括っている「"」は除去したいので、
-e 's/"//g'
も追加します。
これでほしい形になりました。
まとめ
為替情報(JSON)を取得するコマンドは
cat https://api.exchangeratesapi.io/latest > response
日付を抽出するコマンドは
sed 's/.*"date":"\([^"]*\).*/\1\n/' response
通貨レートを抽出するコマンドは
sed -e 's/.*"rates":{\([^}]*\).*/\1\n/' -e 's/,/\n/g' -e 's/:/,/g' -e 's/"//g' response
になりました。
あとはこれらを一つのファイルに並べて記載し、そのファイルを実行します。
結果をファイルに出力すればCSVファイルが完成です。
記事は以上です。