まだまだエクセルファイルを grep する(5)
あらためてるびまを読んでいたら、自分が必要としていた情報はすでに出ていたということにあらためて気づいた。いかに読んでいなかったかが露呈。反省。
大体基本的に win32ole を使うということの意味を理解していなかったのではないかといまさらながら思ったりも。
で、とりあえずそれを参考にして xlsgrep.rb を変更してみる。
こんな感じ。
require 'win32ole'
$KCODE = "SJIS"
def usage
print "usage: ruby xlsgrep.rb $lt;検索文字列> files...\n"
exit(1)
endusage if ARGV.size < 2
pat = Regexp.new(ARGV.shift, Regexp::IGNORECASE, "SJIS")module EXCEL_CONST
endexcel = WIN32OLE.new('Excel.Application')
excel.visible = true if $DEBUG
WIN32OLE.const_load excel, EXCEL_CONSTARGV.each do |xls|
xls = File.expand_path(xls).gsub(/\//s, "\\")begin
print "file:#{xls}\n"
book = excel.workbooks.open xls
##
book.Worksheets.each do |sheet|
sheet.UsedRange.Rows.each do |row|
record = []
row.Columns.each do |cell|
record << cell.Value
end
if record.join(",") =~ pat
print "sheet:#{sheet.name}"
puts record.join(",")
end
end
end
book.saved = true
book.close
end
end
excel.quit
で、試してみた。遅い。ひたすら遅い。
無理もないのだろうけれど、やっぱり遅い。「 . 」の連続を少なくするようにして試してもみたけれど格段に早くなったという印象はなし。
ちなみにテストしたのは家計簿用のファイルで 1 ブック に 13 のシートからなっていて、過去 7 年分を検索させてみた。かかった時間は次のとおり。(単位は秒かな)
テキスト変換してから | 30.734 |
変換せずに直接(今回のもの) | 214.639 |
およそ 7 倍。もっとも妙な一時ファイルを作らなくてよいというメリットはあるのだが、やっぱり遅いなあ。
あるいはもう少し改善の余地があるのかもしれないけれど、自分の用途としては最初のままでも問題ないからよしとするか。
#表の項目をわかりやすい表記に変えてみた。
| 固定リンク
« 皆歌 | トップページ | 完全版 118 枚 »
コメント