今回はRubyで作ったプログラムのお話です。
仕事でデータをチェックする時に、目視だけですると間違えることもあるし、とにかく面倒くさい!
というきっかけでサラっと作ったプログラムです。Rubyを常に使ってるわけではないのであまり綺麗なコードではないと思いますが、ご容赦っ!!
目的
とあるアプリケーションをテストするときにつくったプログラムです。
この”とあるアプリケーション”は、テキストファイルを生成するのですが、出力されたデータが正しいかテストする必要がありまして、1件ずつ目視でチェックするのは面倒だったので、作業を補助するこのプログラムを作った次第です。
(後述にソースコードを載せてあります)
概要
処理概要はこの4点です。
- 対象ファイルを検索して、不足しているキーを見つけ出す
- 重要なキーが不足してたら、色づけしてコンソールに表示する
- 不足キーに関連するキーがあれば、その情報を表示する
- 対象ファイル内で重複したキー行があれば、コンソールに表示する
また、使っているRubyのバージョンは2.0系です。
ざっくり解説
このプログラムでは、クラスやメソッドの定義を先に行い、メイン処理は後から現れてきます。なので、その順に解説していきますね。
標準のStringクラスにメソッドを追加する(6-13行目)
コンソールに表示する文字に色をつけることをするために組み込みクラスStringにメソッドを追加しています。
このように定義しておくと、Stringクラスを拡張して自分でメソッドを追加できます。Rubyの場合、リテラル文字列も文字列オブジェクトとして使えるので、puts "赤色で表示したいよ”.red
とすれば、拡張したStringクラスのredメソッドを使ってコンソールに赤文字で表示できるわけです。
キーにマッチする行を返す、なければnilを返す「search関数」(15-22行目)
ここでは、第1引数に被検索文字列の配列をセットし、第2引数に検索キーワードをセットすることで、キーにマッチする行があれば戻り値として返す、なければnil(空文字)を返す関数を定義しています。
キーリストとテキストファイルを読んでsearch関数で検索する「seek2関数」(24-54行目)
第1引数で指定したCSVファイルからキーリスト(以下ファイルA)を読み込み、第2引数で指定したテキストファイル(同ファイルB)を前述のsearch関数に渡して検索します。
ファイルA、Bは共に文字コードはShift-JISで読み込みます。元々ファイルはWindowsで作られたものなので、この仕様になっていますが、UTF-8で読み込みたい場合は、27,28,67行目のr:sjis
をr:utf8
に変えてください。
また、キーリストのファイルAのサンプルデータは、
AAA,i,ハンドル, BBB,i,タイヤ, CCC,0,スピーカー,P1 DDD,0,フタ,K1
と、こんな感じです。 そして、ファイルAの項目を解説すると、
列番 | 用途 | 備考 |
---|---|---|
#0 | キー項目 | この文字列でテキストファイルを検索する |
#1 | 重要マーク | "i"がセットされていたら重要なキー |
#2 | キー名称 | このキー項目の名前(日本語で記載されている) |
#3 | 関連キー | (オプション) このキーに関連する別のキー項目 |
こんな感じです。
検索対象テキストのファイルBはこんな感じ。コレも実際はCSVファイルになっています。
"KI","K1","A",1,"白","","","" "OP","P1","X",1,"","","","","","","配線なし","" "S","AAA","A",0,"10","","","","","","","","0","0" "S","BBB","B",0,"20","","","","","","","","0","0" "S","DDD","C",0,"30","","","","","","","","0","0"
※追記14/03/13 ファイルBのデータに不備があったので修正しました
検索した結果、キーが見つからないときは、不足キーの名称をコンソールに表示します。このとき、重要なキーなら(ファイルAの#2に”i”がセットされていたら)赤字で表示します。
また、不足キーに#3の関連キーが登録されていたら、それもファイルBから検索してコンソールに表示しています。(この意図は不足している理由をチェックする仕様なんです)
メイン処理(56-80行目)
キーリストとテキストファイルのパスを指定して前述のseek2関数に渡します。一応、キーファイルは複数指定できるように配列にしてあります。
そして、テキストファイルに重複したキーがあったらコンソールに表示します。
まとめ
コードを書きながらどのあたりを関数にまとめるか、がプログラムづくりの”キモ”になりますよね。そういったことも意識しながら作るのが上達への道だと思います。また、今回のコードは見せるのが恥ずかしいくらいのものですが、こうやって見せることで、誰かがツッコミを入れてくれるかもしれません。そういった意見が聞ければ、より上達への近道になるんじゃないでしょうか。
ちなみに2、3時間で作れたプログラムなのですが、今日のブログを書く方が時間かかりましたw