3つのテキストファイルを比較するサンプル (Ruby素人編)

VMWare Serverを会社のノートPCにインストールして、CentOS使ってあれこれ実験しようとしたところ、yumが妙なエラーで止まってしまい苦戦しているbonlifeです。FAQの5番目にある"[Errno -1] Header is not complete."ってヤツですよ…。ということで、挫折感に打ちひしがれながらRubyスクリプトを書いてみました。(かなり久しぶり!)
3つのテキストファイルの内容を1行ずつ比較するスクリプトです。何をしようとしているのかは、以下でご確認くださいませ。

#!/usr/bin/env ruby
#
# by bonlife
#

# arguments check

if ARGV.length != 3 then
  print $0 , " needs 3 files.\n"
  exit(1)
end

# file to array

def make_array(f)
  f.readlines.each{|x|
    x.chomp!
  }
end

# pass arguments to make_array()
# generate array_list

array_list = Array.new

begin
  (0 .. ARGV.length - 1).each {|i|
    array_list << make_array(File.open(ARGV[i]))
  }
rescue
  abort(("error : " << $!))
end

# (for debug)
# p array_list

# display result

array_list[0].each {|pkg|

  line = pkg + ','

  if array_list[1].include?(pkg) then
    line << "included,"
  else
    line << "not included,"
  end

  if array_list[2].include?(pkg) then
    line << "included\n"
  else
    line << "not included\n"
  end

  print line
}

どうでしょう。求む添削です。自分で思ったのは以下の点。

  • ARGVをそこそこ有効活用
  • Range#eachがRubyっぽい(気がする)
  • Array#include?は遅そう… (Hashにした方が良いかも)
  • 文字列の連結では << が速いらしい (参考 : ぞえ の戯れ言 - 文字列の連結)
  • Arrayを使っているので1つ目のファイルの行順に表示される

あぁ、やっぱりRubyって使いやすい気がする。この本買っちゃおうかしら。

Rubyレシピブック 第2版 268の技

Rubyレシピブック 第2版 268の技