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って使いやすい気がする。この本買っちゃおうかしら。
- 作者: 青木峰郎,後藤裕蔵,高橋征義,まつもとゆきひろ
- 出版社/メーカー: ソフトバンク クリエイティブ
- 発売日: 2007/02/01
- メディア: 単行本
- 購入: 9人 クリック: 182回
- この商品を含むブログ (97件) を見る