以下のプログラムをblood.rb
という
名前で作成・保存し、実行してみよう。
# # 血液型占い # # # より後ろに書いてあるのはコメントでプログラム実行には関係ない。 # 面倒なら入力しなくても構わない。 print "あなたの血液型は?: " btype = gets # データを読む。 if /ab/i =~ btype print "器用ですか?\n" elsif /a/i =~ btype print "まめですか?\n" elsif /b/i =~ btype print "熱血ですか?\n" elsif /o/i =~ btype print "大きいですか?\n" else print "まじめにやってね\n" end
上記のプログラムの解釈に必要な基本的なこと。
Rubyでは、
/パターン/ =~ 文字列
という式で、照合したい文字列に「パターン」があるか検査できる。 利用できるパターンの書き方のことを正規表現という。
Rubyで正規表現のパターンを指定するには、
/パターン/
とプログラム中に直接パターンを書くか、
Regexp.new(文字列)
と文字列から正規表現パターンを作成する。
我々が日常的に利用する「データ」は多くの場合 表形式で表現できる。これは全てのデータが同じ順番で 同じ項目の順番で書かれたものという前提が置ける。
全ての項目が揃った1単位のデータのことをレコードという、 レコードの中にあるひとつひとつの項目のことをフィールドという。 たとえば、電話帳のデータでいえば
漢字氏名 カタカナ氏名 電話番号その1 電話番号その2 メイルアドレスその1 メイルアドレスその2 住所
の全体を「レコード」、漢字氏名やカタカナ氏名などの最小項目単位を 「フィールド」という。表計算ソフトなどでは1レコードを1行に、 1フィールドを1セルに書き込んで表現する。表計算ソフトなどでは データの集合を保存するときにはデフォルトでそのソフト固有の保存形式で 記録している。このため、なんらかのデータを専用ソフトで作成して ファイルに保存したものは、その保存形式に対応したソフトを使わない 限り開くことができない。
複数のフィールドをフィールドごとにカンマ(,)で区切り、 1レコードを1行におさめたテキストファイル形式をCSV形式という(Comma Separated Value)。CSV形式はアプリケーションに依存しない一般的な データファイル形式で、データ処理を行なうプログラムであれば ほぼ全てのソフトウェアから利用できる。このため、誰にでも参照して もらいたいデータファイルはCSV形式にして保存・受け渡しするのが 基本である。
CSV形式は
ようにする。フィールドに空白文字かカンマを含む文字列が来るときは 必ずダブルクォーテーションで括る。たとえば、
という4つのフィールドを表すときは
Hello,123,"456","Hello, world"
のように記す。
CSV形式で保存しておけば、どんなプログラムでも開けるし、コンピュータが あり続ける間いつまでもそのまま利用できる。
/home/staff/yuuji/zip_jp.txt
は日本全国の郵便番号をCSV
形式で記録したファイルである。まずは中味を見てみよう。ktermで以下のよう
にコマンドを実行する。
% less /home/staff/yuuji/zip_jp.txt
SPCで一画面進み、bで一画面戻る、 qで終了。
このデータベースから、市内(町内)の郵便番号を検索するプログラムを作っ てみよう。
これを行なうプログラム postal.rb
$KCODE='e' city='酒田市' cityrx=Regexp.new(city) printf "%sの町名は: ", city town = gets.chomp townrx = Regexp.new(town) open("/home/staff/yuuji/zip_jp.txt", "r") do |z| while line=z.gets if cityrx =~ line && townrx =~ line print line end end end
city
変数のところを好きな市町村名に変えて試してみよう。
CSV形式にしなくとも、「1行に1レコード」という形式にすれば そこから検索するプログラムを作るのは簡単である。