1800個のtxtファイルの検索を早くするには


ded  2003-11-12 01:15:12  No: 109895

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


ねろ  2003-11-12 02:14:37  No: 109896

InStrのヒット率にもよりますが、ファイルを一行ずつ
読み込んでInStrするより、RichTextBoxに読み込み
一度で検索するほうが早いのでは。
それと
検索文字が有った時に使用する"i"や"j"や"k"を毎回
作るのは時間のロスです。検索文字が見つかった時だけ
作ってはどうですか。


Say  2003-11-12 08:20:19  No: 109897

VBにこだわらないのなら、grepを使ってみるとか。


しゅう  2003-11-12 09:08:42  No: 109898

ねろさんが言われる様に内側のループが気になったので、
自分なりに解釈してちょっと作ってみました。
不要な処理はしない様にしましょう。

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


しゅう  2003-11-12 21:11:12  No: 109899

単純に下記でファイル(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


ももんが  2003-11-13 00:13:27  No: 109900

VBとは直接関係ないけど最近流行の RAID を使えばもっと早くなるかも。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加