1800個のTXTファイル(1ファイル20000行程度)
から任意の文字列を検索したいのですが、時間がかかるので
よい方法は無いでしょうか?
instr位しか知らないもので。
現在コードは下記の用に記述しております。
よろしくお願いします。
g = "第*番 *"
k = ""
d = Text8.Text '検索文字
Open App.path & "\kihon.txt" For Input As #1
Do Until EOF(1)
Input #1, a
Open App.path & "\COMBO用ファイル\" & a & ".txt" For Input As #2
Do Until EOF(2)
Input #2, b
f = Len(b) - 4
b = Left(b, f)
Open App.path & "\" & a & "\" & b & ".txt" For Input As #3
Do Until EOF(3)
Input #3, c
h = c Like g
m = InStr(c, "附")
If m > 0 Then
k = "附"
End If
If h = True And k = "" Then
j = InStr(1, c, "番")
i = Left(c, j)
End If
e = InStr(c, d)
If e > 0 Then
If k <> "" Then
i = k
End If
Form3.List1.AddItem a & " " & b & " " & i & " " & c
End If
Loop
k = ""
Close #3
Loop
Close #2
Loop
Close #1
InStrのヒット率にもよりますが、ファイルを一行ずつ
読み込んでInStrするより、RichTextBoxに読み込み
一度で検索するほうが早いのでは。
それと
検索文字が有った時に使用する"i"や"j"や"k"を毎回
作るのは時間のロスです。検索文字が見つかった時だけ
作ってはどうですか。
VBにこだわらないのなら、grepを使ってみるとか。
ねろさんが言われる様に内側のループが気になったので、
自分なりに解釈してちょっと作ってみました。
不要な処理はしない様にしましょう。
g = "第" & "*" & "番" & " " & "*" 'こうじゃないかと勝手に思いました。
d = Text8.Text '検索文字
N3 = FreeFile '空きファイル番号取得
Open App.Path & "\" & a & "\" & b & ".txt" For Input As #N3
Do Until EOF(N3)
Input #N3, c '検索する行を取り出す。
If c Like g Then '第*番 * という文字列があるか?
If InStr(c, d) <> 0 Then 'Text8で指定した文字列があるか?
If InStr(c, "附") Then '附という文字があるか?
i = "附" 'あったらiに"附"をいれる。
Else
i = "" 'なければiには何も入れない。
End If
Form3.List1.AddItem a & " " & b & " " & i & " " & c
End If
End If
Loop
Close #N3
単純に下記でファイル(32*20000byte)を読み込んで時間を測定したら、
0.16秒かかりました。(Win98SE,700MHz,VB6.0SP5)
という事は1800個のファイルを読み込むだけで288秒かかりますね。
Open Path For Input As #N
Do Until EOF(N)
Input #N, ReadTxt(i)
Loop
Close #N
VBとは直接関係ないけど最近流行の RAID を使えばもっと早くなるかも。
ツイート | ![]() |