« 皆歌 | トップページ | 完全版 118 枚 »

まだまだエクセルファイルを grep する(5)

 あらためてるびまを読んでいたら、自分が必要としていた情報はすでに出ていたということにあらためて気づいた。いかに読んでいなかったかが露呈。反省。

 大体基本的に win32ole を使うということの意味を理解していなかったのではないかといまさらながら思ったりも。

 で、とりあえずそれを参考にして xlsgrep.rb を変更してみる。
 こんな感じ。


require 'win32ole'
$KCODE = "SJIS"
def usage
print "usage: ruby xlsgrep.rb $lt;検索文字列> files...\n"
exit(1)
end

usage if ARGV.size < 2
pat = Regexp.new(ARGV.shift, Regexp::IGNORECASE, "SJIS")

module EXCEL_CONST
end

excel = WIN32OLE.new('Excel.Application')
excel.visible = true if $DEBUG
WIN32OLE.const_load excel, EXCEL_CONST

ARGV.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 枚 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/28835/11601608

この記事へのトラックバック一覧です: まだまだエクセルファイルを grep する(5):

« 皆歌 | トップページ | 完全版 118 枚 »