Rubyでファイル抽出プログラムを書いてみた

投稿者: | 2015-07-17

最近ふと思うことがあってRubyを勉強してみました。
手始めに昔Visual Basic (.NET?)で書いたプログラムをRubyで書きなおしてみました。

ここでは今回つくったプログラムを便宜的に「ファイル抽出プログラム」とします。

・ファイル探索元(from)と抽出先(to)を選択
・ある特定の拡張子(.html等)を、from以下すべてのディレクトリから探しだす
・その文字コードをそれ自体の文字コード(たとえばUTF-8)で読み出す
・ それをtoへ1ファイルずつ文字コード変換(たとえばShift_JIS)して出力する

こんなプログラムを書きました。 
ちなみに、今回このように一般向けに公開しようと思ったので、本来僕が書いたのものとは若干違っています。

まあ結果としてRubyで書いたほうがコードは少し短くなりました。 抽出時間も少し短くなったはずです。
ただし、すべてコマンドライン操作。

コードの解説は面倒なので書きませんが(笑)、希望される方はご一報ください…

def dir_size(from)
dname = from
sum = 0
Dir.glob("#{dname}/**/*.html") do |fn|
sum += File.stat(fn).size
end
sum / 1000
end
from = ARGV[0]
to = ARGV[1]
from = from.gsub(/\\/,'/')
to = to.gsub(/\\/,'/')
if File.directory?(from)
if File.directory?(to)
puts "directory exists."
#puts "estimating required time..."
size = dir_size(from)
printf("filesize: %d KB\n", size)
printf("estimated time: %.1f minutes.\n", size / 100.0 )
print ("extracting...")
puts
Dir.glob("#{from}/**/*.html") do |f|
bn = File.basename(f)
File.open(f, 'r:UTF-8') do |enc|
$stdout.reopen("#{to}/#{bn}", 'w')
puts enc.read.encode("Shift_JIS")
end
end
else
puts "cannot find #{to} directory."
end
else
puts "directory not exists."
end
 

今回付けてみた、最初のdir_size(from)っていうメソッドでどれくらい抽出に時間がかかるのかを計算するためのファイルサイズを計算してるのですが、ここでファイル探索してる時間が余分になりますww
ここで計算してる時間があったらさっさと抽出しろよ、みたいな…(笑) 

あとはWindowsでプログラム書いてた思ったんですが、ディレクトリパスはWindowsは¥で区切るのがデフォルトですが、すごく紛らわしいのでスラッシュ「/」を使ったほうがいいということに気づきました。
そこで13,14行目でコマンドライン引数から入れたディレクトリパス名を、正規表現を利用して「¥」から「/」に変換しています。

.htmlのところを変えてみるだけでほかのテキストベースのファイルも抽出できるようになるかと思います。 

僕は以前Perlなんかも使ってたことがあるのですが、Rubyのほうがいろいろと楽です。かと言ってPHPみたいに特定の作業にしか使えないとか、そういうわけではなくて 、むしろRuby on Railsとか、普通の日常的なツール開発とか、幅広く使えそうなのがとてもいいですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です