こんにちは、山本です。
"HFC01730@... (水羽信男)"さんは書きました:
> 1)僕の課題は159あるGB2312のhtmlファイルすべてに検索をかけて、特定のキーワードの
> 使用状況の確認でした。
おせっかいかと思いましたが、Tcl/Tkで↓を作ってみました。
Windowsをお使いのようでしたので、Windows用のスクリプトとして
作ってあります。実行にはActiveTclが必要です。
(http://aspn.activestate.com/ASPN/Tcl)
このスクリプトはWindowsの漢字コード(SJISというかcp932)で
"find.tcl"というファイルに保存して、エクスプローラから
ダブルクリックして起動してください。
# utf-8やGB2312など他のencodingで保存しないでください。
なお、私はGB2312のファイルを持っていないので、
これでちゃんと検索できるかどうかは判りません m(_._)m
===== ここから ============================================================
set enc "gb2312" ;# Windows漢字で検索する場合は "cp932"
set filePattern "*.htm *.html" ;# grepするファイル名のパターン
# widgetのセットアップ
option add *font {{MS ゴシック} 9}
grid [label .descFolder -text フォルダ: -anchor e] \
[entry .folder -textvariable folder -width 40] \
[button .chooseFolder -text 選択... -command chooseFolder] \
-row 0 -sticky ew
grid [label .descFile -text ファイル名: -anchor e] \
[entry .filePattern -textvariable filePattern -width 40] \
-row 1 -sticky ew
grid [label .descPattern -text 検索パターン: -anchor e] \
[entry .pattern -textvariable pattern -width 40] \
[button .grep -text 検索 -command grep] \
-row 2 -sticky ew
grid [text .result -width 80 -height 20 -yscrollcommand {.ys set} -wrap none] \
-row 3 -column 0 -columnspan 3 -sticky nesw
grid [scrollbar .ys -orient vertical -command {.result yview}] \
-row 3 -column 3 -sticky ns
bind .pattern <Return> grep
focus -force .pattern
set folder [pwd]
# フォルダを選択する
proc chooseFolder args {
set ::folder [tk_chooseDirectory -initialdir $::folder]
}
# grepする
proc grep args {
.result delete 1.0 end
set filecount 0
foreach pat $::filePattern {
foreach filename [glob -nocomplain [file join $::folder $pat]] {
set fd [open $filename]
fconfigure $fd -encoding $::enc
# 読み込んだHTMLに含まれる"<"から">"までを削除
regsub -all -- {<[^>]*>} [read $fd] {} html
close $fd
set count [regexp -all -- $::pattern $html]
if $count {
incr filecount
.result insert end "[format %8d $count]件 "
.result insert end $filename $filecount
.result insert end \n
.result see end
.result tag configure $filecount -foreground blue -underline 1
.result tag bind $filecount <Button-1> [list shellexecute $filename]
.result tag bind $filecount <Enter> \
[list .result tag configure $filecount -background yellow]
.result tag bind $filecount <Leave> \
[list .result tag configure $filecount -background white]
}
}
}
.result insert 1.0 $filecount個のファイルに見つかりました。\n
.result mark set insert 1.0
.result see insert
}
# Windowsシェルを利用してファイルを開く
package require tcom
set shell [::tcom::ref createobject Shell.Application]
proc shellexecute filename {
$::shell ShellExecute [regsub -all -- / $filename \\]
}
===== ここまで ============================================================
--
Koichi Yamamoto,
http://homepage3.nifty.com/yamakox/