やりたいこと
かれこれ3年半ほどベトナム駐在員やってますが、毎月の経費精算でJPY-VND為替レートをググって調べるのが面倒なので、簡単に取得できるようにしたい。コマンドで(病気)。
方針
EXCHANGE-RATES.ORG さんのデータを curl で取得してゴニョゴニョする。
EXCHANGE-RATES.ORG さんの過去レートの URL のフォーマットは、
https://..../JPY/VND/YYYY-MM-DD
なので、先月末の日付けを取得し、それをくっつけて curl して加工すれば良い。データとしては、1円、100円、1万円、100万円のデータが少数点以下2桁で四捨五入されて提供されている。月々の経費精算なんて、所詮数万円レベルなので、1万円のものを使っておけば良いが、可能な限り正確に一点の曇りもなくやりたいので、一番数字が入ってる100万円のヤツを使う。
VND のところは、USドルならUSD、ユーロなら EUR、タイバーツなら THB などと適当に変換したいものを入れてください。
先月末の日付けを取得する(Mac)
[bash date のよく使う例まとめ - 6VOX](http://blog.6vox.com/2014/03/bash-date.html,bash date のよく使う例まとめ - 6VOX) を参考に。
date -v1d -v-1d +'%Y-%m-%d'
これだけ。閏月とかは気にしなくても勝手にやってくれる。date コマンドが Mac は微妙に違うので、他の人は、d オプションとかでなんとかしてください。
$ date +'%Y-%m-%d'
2018-06-26
$ date -v1d -v-1d +'%Y-%m-%d'
2018-05-31
3月にして、ホントに大丈夫か確認。
$ date +'%Y-%m-%d'
2018-03-31
$ date -v1d -v-1d +'%Y-%m-%d'
2018-02-28
$ date +'%Y-%m-%d'
2020-03-31
$ date -v1d -v-1d +'%Y-%m-%d'
2020-02-29
問題なし。
curl して必要なものだけを取り出す
ソースコード見ながら、どうするか検討。
curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96
もっとスマートにやれそうな気がプンプンするけど、見直すのが面倒なので、これで。
何をやっているかをざっと説明すると、
- date コマンドで取得した先月末日を URL にくっつけて curl
- 進行状況は必要ないので、消す -s
- 必要なデータのある行を取得 grep '1 JPY'
- 取得したい数字の先頭に「、」がくっついているので削除し、 cut コマンドで処理するために半角スペースに変換 sed -e 's/、/ /g'
- 数字に「,」が入っていると計算できなくなるので、削除 sed -e 's/,//g'
- 半角スペースで区切って96個目?の要素を抽出 cut -d ' ' -f 96
$ curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96
209624755.30
100万円を変換したベトナムドンが取得できた。取れなくなったら、サイトの構造か何かが変わったはずなので、見直す。
計算する
100万円だと使いづらいので、100円にする。うちの経費精算のレート入力は、100円だし。計算するときに、入力も出力も整数ではなく、普通に計算できないので、echo で計算式を作って bc に渡すようにする。
$ echo "scale=6; 209624755.30/10000" | bc
20962.475530
こんな感じになれば良い。
完成
echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
USD などで、100円が1ドル未満になるような場合、bc コマンドでの計算は .91927 などとなってしまうので、0.91927 などと表示したければ、以下のようにすると良い。
echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc | sed -e 's/^\./0\./g'
$ echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d '+%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
.919271
$ echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/USD/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc | sed -e 's/^\./0\./g'
0.919271
こんなの毎月打ってられないので、関数として登録。(関数にするなら、ワンライナーである必要はないのでは?)
+ vndrate() {
+ echo "scale=6; $(curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d '+%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 96) / 10000" | bc
+ }
えい。
$ source ~/.bashrc
$ vndrate
20962.475530
pbcopy するかは好きにしてください。
なお、「良いよ、そんな細かい端数なんてどうでも」という場合は、-f 54 で取れるので、計算しなくて良い。
$ curl -s https://ja.exchange-rates.org/Rate/JPY/VND/`date -v1d -v-1d +'%Y-%m-%d'` | grep '1 JPY' | sed -e 's/、/ /g;s/,//g' | cut -d ' ' -f 54
20962.48
来月の経費精算時に、こんなものを作ったことを忘れてそう。