本記事では、gemとライブラリについて解説します。
gemとは簡単にいえばライブラリで、誰かが作ったものを自分のプログラムで使うことができるのです。
gemを使えば毎回イチからプログラムを作る必要がなくなります。
gemは膨大な数になりますが、ほんの一部を紹介します。
ぜひ雰囲気をつかんでください。
gemとは!という定義は後にして、実際に動かしてみましょう。
都道府県を取得するjp_prefecture
JIS X 0401 により、各都道府県におおむね北東から南西へ、01から47までの番号が割り振られています。
みなさんのお住いの都道府県にも、必ず番号が振られています。
都道府県コードから、都道府県を得るプログラムはどうすればよいでしょうか?
すぐに思いつく方法は、どこかに配列またはハッシュを定義してそれを呼び出すというものでしょう。
確かにそれでもよいのですが、もう少しスマートにgemを使ってみましょう。
都道府県コードから都道府県名を取得したい!と思ったらまず「gem 都道府県」で検索しましょう。
jp_prefectureがヒットします。
jp_prefecture とは都道府県コードと都道府県名を変換するライブラリです。
と説明があります。これを使いましょう。
gemはだいたいインストール方法や使い方が書かれています。
上記のリンクによると、以下でインストールできるそうです。
$ gem install jp_prefecture
やってみましょう。以下のようなメッセージが返ってくれば成功です。
Fetching: jp_prefecture-0.9.0.gem (100%) Successfully installed jp_prefecture-0.9.0 1 gem installed
確認はこうします。
$ gem list | grep jp_prefecture
以下が表示されれば完了です。
jp_prefecture (0.9.0)
使い方も書いてあるので、まねてみましょう。
require 'jp_prefecture' pref = JpPrefecture::Prefecture.find 13 puts pref.name
[実行結果]
東京都
もうできました!
都道府県コード13は東京都なので、”東京都”という文字列が表示されました。
もうちょっと解説を見ると、都道府県名から都道府県コードを得ることもできるようです。
require 'jp_prefecture' pref = JpPrefecture::Prefecture.find name: "東京都" puts pref.code
[実行結果]
13
今度は”東京都”から13を得ることができました。
さらによく見ると、地方も得られるようです。例えば東京であれば関東ですよね。
これを使って、関西地方の都道府県だけ出してみましょう。
require 'jp_prefecture' JpPrefecture::Prefecture.all.each do |ar| if ar.area == "関西" puts ar.name end end
[実行結果]
三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県
できました!!
近畿二府四県を取得できました。
ここで郵便番号を取得すること自体のコーディングは一切していないということに注目してください。
他にもさまざまな使い方があるようですが、そろそろ別のgemに行きましょう。
CSVファイルを読み込む CSV
CSVファイルをパース(構文解析、要はカンマごとの値を取り出す等々)したいことはよくあります。
どうせだったら、カンマごとに配列に入れてくれればいいのに・・・
そう思いますよね。
自分が欲しいと感じたら、Rubyの世界ではだいたいがgemとして公開されています。それを使わない手はありません。
というわけで「gem CSV」で検索すれば、以下がヒットします。
その名もcsvです。そのまんまですね。
ここを見てみると、やはりインストール手順と使い方が書いてあります。
インストールは以下のとおりです。
$ gem install csv
適当なCSVファイルを用意しましょう。
今回は郵便番号データを使います。
東京の分だけダウンロードしましょう。
ZIP形式なので、ダウンロードして解凍すると13TOKYO.csvというファイルができます。
そのファイルをソースファイルと同じフォルダに保存してください。
そしてCSVのページへ戻ると、使い方が書いてあります。
require "csv" CSV.foreach("path/to/file.csv") do |row| # use row here... end
だそうです。
とりあえず動くかどうか知りたいので、空振りすることを予想してそのまま動かしましょう。
require "csv" CSV.foreach("13TOKYO.CSV") do |row| # use row here... end
[実行結果]
invalid byte sequence in UTF-8 (ArgumentError)
いきなりエラー・・・
「ruby csv 読み込み」で改めて検索してみましょう。すると、エンコード指定で読み込む方法が見つかります。
ついでに、foreachも変ですね。eachに直しましょう。
読み込みも分けて簡潔にします。
まずは中身を確認するまでいきましょう。
require "csv" csv_data = CSV.read("13TOKYO.CSV", encoding: "Shift_JIS:UTF-8") csv_data.each do |row| p row end
[実行結果]
・・・中略・・・ ["13421", "10022", "1002211", "トウキヨウト", "オガサワラムラ", "ハハジマ", "東京都", "小笠原村", "母島", "0", "0", "0", "0", "0", "0"]
何か出ました!
どうやらrowに1行分の内容が配列で入っているようです。
ということは、郵便番号っぽい3つめを指定すれば良いのでしょうか?
require "csv" csv_data = CSV.read("13TOKYO.CSV", encoding: "Shift_JIS:UTF-8") csv_data.each do |row| p row[2] end
[実行結果]
・・・中略・・・ "1001511" "1001701" "1002100" "1002101" "1002211"
出ました!
あとは、要素指定して千代田区のものだけを出力、などの工夫ができますね。
まとめ
本記事では、gemの使い方を解説しました。
今後「誰でも思いつきそうなことなら、何か良いgemはないかな?」と考えてみてください。
きっとどこかの誰かが先に作ってくれていますよ!