与えられたデータを自動的に処理するプログラムの必要性と有用性は高い。 そのことを見越して、自動処理しやすい形式でデータファイルを 作成しておくことが重要である。
テキストを処理するプログラムは,その入力パターンに応じて処理を 決定する。入力パターンの照合は対象となるの書式を元に決める。
split
メソッドで分解
正規表現を用いて解析
ある特定の文字でフィールドを区切られている書式(DSV; Delimiter-Separated
Value)で,フィールド値に区切り文字が現れないようなものは
split
で簡単に解析できる。csvファイルの処理例を示す。
yamagata.csv
は,
文字列もクォートなしで書かれたcsvファイルで,
第6フィールド | 市町村名 |
---|---|
第9フィールド | 総人口 |
第10フィールド | 男人口 |
第11フィールド | 女人口 |
となっている。これを split
で分解して,
市町村と総人口のみの集計出力を得るには以下のようにする。
#!/usr/bin/env ruby # coding: euc-jp while line=gets data = line.chomp.split(",") printf("%-20s%s\n", data[5], data[8]) end
固定区切りでないものは正規表現でパターンマッチを行ない, 後方参照を用いてマッチした一部を取り出す。
電子メイルのファイルから差出人を抽出してみる。
差出人はメイルヘッダの Return-path
か,From
の値から取得する。電子メイルのヘッダは,1行目から始まり,空行で終わる。
行頭(先頭カラム)から始まり,コロンまでのものがフィールド名,
その後ろがフィールド値である。
メイルのヘッダ部分のみを繰り返す処理は,
while line=gets break if /^$/ =~ line 〜処理〜 end
のように書ける。この間で,Return-path
または
From
を得る処理は以下のようにする。
while line=gets break if /^$/ =~ line if /^(return-path|from): *(.*)/i =~ then from = $1 end end
これを応用して,1通のメッセージを含むファイルから差出人などの 情報をサマリ表示するプログラムを作ると以下のようになる。
#!/usr/bin/env ruby # coding: euc-jp # Parse rfc2822 header and display summary while line=gets break if /^$/ =~ line if /^(return-path|from): *(.*)/i =~ line then from = $2 elsif /^subject: (.*)/i =~ line then subj = $1 elsif /^date: (.*)/i =~ line then date = $1 end end printf("%s: %sさんからの「%s」というメイルです。\n", date, from, subj)