0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

先月末の為替レートを取得するコマンド

Posted at

やりたいこと

かれこれ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

こんなの毎月打ってられないので、関数として登録。(関数にするなら、ワンライナーである必要はないのでは?)

~/.bashrc
+ 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

来月の経費精算時に、こんなものを作ったことを忘れてそう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?