Exerbを使って単純にファイルを分割するツールを作ってみたよメモ
シャンプーをサクセスに変えてみたbonlifeです。抜け毛が気になってきたわけではありません。
さてさて、会社ではAIX使ってるのですが、そこで使ってる簡易ツールをWindows上でも使えるようにしたいな、と思い、練習がてらRubyで簡単なスクリプトを書いてみました。(ってのはほとんど嘘で、単調な仕事をしていたら退屈なので暇つぶしに別のことをやってみました。) Rubyで手続き型!って感じのスクリプトを書くとちょっぴり罪悪感。Perlだったらなんとなく許されそうな気分なんですけどね。(今回、Rubyを使ってみたのには特に理由はありません。どの言語もいまいち使いこなせていないので…orz)
EDIデータについてる固定長のヘッダ部分を分割するツールです。あえてスクリプトにしなくても良いぐらい簡単なものですが、バイナリデータの場合、Windowsではちょっと扱いづらかったりするので。そういえば、スクリプトをWindows実行形式ファイルに変換するツールがあったよなぁ、と思い出し、Exerbにチャレンジ。ダウンロードして setup.rb を実行したら、準備OKです。
まずは、Rubyのスクリプトを書きます。optparseを初めて使ってみましたが、-h(--help)、-v(--version) に最初から対応していたりして、結構便利っぽいです。あと、Rubyは引数のワイルドカード展開に対応していて、シェルスクリプトっぽく書けて気分が良いです。ということで、出来たスクリプトはこんな感じ。
- divhdr.rb
#!/usr/bin/env ruby # # divhdr (ファイルの先頭部分を切り取るスクリプト) # require "optparse" # オプションの解析 Version = "1.0.0" length = 156 parser = OptionParser.new parser.banner = "Usage: divhdr [options] file [file ...]" parser.on('-l LENGTH') {|v| length = v.to_i} def parser.usage() $stderr.puts help() exit(1) end begin parser.parse! rescue parser.usage() end if ARGV.length < 1 parser.usage() end # 読み込み用ファイルオブジェクトの取得 def get_file_obj(file) if FileTest.file?(file) begin return File.open(file,"rb") rescue $stderr.puts "ERR : Can't open '#{file}'" end else $stderr.puts "ERR : Can't get file object from '#{file}'" end end # 出力ファイル名生成 def out_filename_generate(file_name) return file_name + ".hdr", file_name + ".msg" end # ファイル出力 def out_to_file(file_name, contents) begin File.open(file_name,"wb").write(contents) rescue $stderr.puts "ERR : Can't write to file '#{file}'" end end # ファイル分割 def div_contents(file_obj,length) hdr = file_obj.read(length) msg = file_obj.read() return hdr, msg end # 引数を読み込んで処理 ARGV.each do |i| fo = get_file_obj(i) if fo hdr, msg = div_contents(fo,length) hdr_name, msg_name = out_filename_generate(i) out_to_file(hdr_name,hdr) out_to_file(msg_name,msg) end end
このファイルをExerbでWindows実行形式ファイルに変換します。
C:\test\ruby> ruby -r exerb/mkexy divhdr.rb C:\test\ruby> exerb divhdr.exy
これで divhdr.exe が出来ちゃうんだから素敵。なんと言っても簡単!
ちなみに、最初、ちゃんとドキュメントを読まずにRubyスクリプトをいきなりexerbしたら、以下のようなことになっちゃいました。
C:\test\ruby> exerb divhdr.rb C:\test\ruby> divhdr * divhdr.rb:6:in `require': No such file to load -- optparse (LoadError) from divhdr.rb:6
exe への変換までは出来ますが、実行時に外部モジュールを読み込めずにエラーになりましたよ。外部モジュールを使う場合は、必ず mkexy してレシピファイルを事前に用意しておかないといけないみたいですね。なるほど、なるほど。これを活かして、何かもうちょっと自分の仕事に役に立つことをやりたいなぁ…と思ったり思わなかったりな今日この頃です。