読者です 読者をやめる 読者になる 読者になる

tarのブログるっ by @tarVolcano

メガネ男子のtarが書くブログです。

ファイル内を検索して不足キー項目を表示するRubyプログラム

photo by shino 誌野

今回は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:sjisr: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

対象ファイルを検索して、不足しているキーを表示する

  • このエントリーをはてなブックマークに追加