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

このファイルをExerbWindows実行形式ファイルに変換します。

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 してレシピファイルを事前に用意しておかないといけないみたいですね。なるほど、なるほど。これを活かして、何かもうちょっと自分の仕事に役に立つことをやりたいなぁ…と思ったり思わなかったりな今日この頃です。