Newsgroup: it.comp.lang.visual-basic
Titolo: Ricerche a testo libero

Saluti a tutti.
Ho un problema che sembra di difficile soluzione: come fare una ricerca
atesto libero VELOCE in un file i testo piuttosto grande (diciamo 25 Mb)?
Ho tyrovato qualche strumento (DTsearch ecc.) ma tutti sembrano di alto
livello e di alti costi; una volate esisteva una DLL (Fast Text Search mi
pare) che però sembra sia rimasta ancora in versione 16 bit. Qualcuno ha
qualche idea?
Grazie per qiualsiasi suggerimento
Mario

...

Non so se ho capito bene....
Se vuoi cercare una stringa in un file molto grande beccati sta chicca:
=======================================================
=======================================================
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Sub Form_Load()
    Dim dtStart As Date
    Dim TicksStart As Long
    MsgBox "Inizio"
    dtStart = Now
    TicksStart = GetTickCount()
    'If CercaStringaInFile("c:\t\x1.txt", "Memoria insufficiente") Then
    If CercaStringaInFile("c:\windows\system\kernel32.dll", "Memoria
insufficiente") Then
        MsgBox "Fine, Trovata" & vbCrLf & (GetTickCount() - TicksStart) /
1000 & " Secondi"
    Else
        MsgBox "Fine Non c'e'" & vbCrLf & (GetTickCount() - TicksStart) /
1000 & " Secondi"
    End If
    End
End Sub
Function CercaStringaInFile(NomeFile$, Testo$) As Boolean
    '
    ' Autore:
    ' Ettore Maronese  By -MES-  21/02/1999  
il...@usa.net
    '
    Const LEN_BUF& = 65536
    Dim Buffer$, BufferRx$
    Dim LFile As Long
    Dim Stato%
    Dim Trovato As Boolean
    Dim IdFile As Integer
    Dim LenTesto%, PosInsert%
    LFile = FileLen(NomeFile$)
    IdFile = FreeFile
    Open NomeFile$ For Binary Access Read As #IdFile
    Trovato = False
    If LFile <= LEN_BUF Then
        BufferRx$ = Space$(LFile)
        Get #IdFile, , BufferRx$
        If InStr(BufferRx$, Testo$) Then Trovato = True
    Else
        BufferRx$ = Space$(LEN_BUF)
        Get #IdFile, , BufferRx$
        If InStr(BufferRx$, Testo$) Then
            Trovato = True
        Else
            LenTesto% = Len(Testo$)
            PosInsert% = LenTesto% + 1
            LFile = LFile - LEN_BUF
            Buffer$ = Space$(LenTesto% * 2)
            Mid$(Buffer$, 1, LenTesto%) = Right$(BufferRx$, LenTesto%)
            For LFile = LFile To LEN_BUF + 1 Step -LEN_BUF
                Get #IdFile, , BufferRx$
                If InStr(BufferRx$, Testo$) Then
                    Trovato = True
                    Exit For
                Else
                    Mid$(Buffer$, PosInsert%, LenTesto%) = Left$(BufferRx$,
LenTesto%)
                    If InStr(Buffer$, Testo$) Then
                        Trovato = True
                        Exit For
                    End If
                    Mid$(Buffer$, 1, LenTesto%) = Right$(BufferRx$,
LenTesto%)
                End If
            Next LFile
            If Trovato = False And LFile > 0 Then
                BufferRx$ = Space$(LFile)
                Get #IdFile, , BufferRx$
                BufferRx$ = Left$(Buffer, LenTesto%) & BufferRx$
                If InStr(BufferRx$, Testo$) Then Trovato = True
            End If
        End If
    End If
    Close #IdFile
    CercaStringaInFile = Trovato
End Function
=======================================================
=======================================================
E' ottimizzatissima.
Penso che col VB non si possa far di meglio.
In interpretato mi scandisce un file da 500Kb in 0,06 secondi e 28Mb in
5.8/6.3 secondi.  (Pentiom MMX 266 win95). Poi dipende molto anche dalla
velocita' dell'HD.
Mi chiedo se vale la pena fare un prj per il Sito Comune....?
Ciao
By -MES-   Maronese Ettore
http://ilmes.freeweb.org
(con OCX per stampare i recordset)
Sito Comune di programmatori Visual Basic
http://www.murialdo.it/it_lang_vb