Avatar billede sjh Nybegynder
07. december 2002 - 04:19 Der er 3 kommentarer og
1 løsning

Hurtig søgning i en fil

Hvordan kan jeg lave er hurtig søgning i en fil, har lavet noget kode, men det tager langtid for at søge ca 2MB fil igennem hvad kan man lave om?

Skal lige siges at den skal sendes som en fil til et andet program, det er alså ikke explore som skal læse det.

<%
  Response.expires = 0
  Response.expiresabsolute = Now() - 1
  Response.addHeader "pragma", "no-cache"
  Response.addHeader "cache-control", "private"
  Response.CacheControl = "no-cache"
  Response.Buffer = True
  Response.ContentType = "text/html"
%>

<%
  Dim fso
  Dim f
  Dim strQ
  Dim filespec
  Dim i
  Dim arrLine
  Dim strLine
  Dim NotInStr
  Dim strOut

  strQ = Request.Querystring("q") ' Søge string.

  filespec = Server.Mappath("/search/search.txt") ' Søge i filen.

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile(filespec, 1)
    Do While Not f.AtEndOfStream
      strLine = f.ReadLine
      arrLine = Split(strQ, " ") ' Splitter SPACE op
      For i = 0 To UBound(arrLine)
        NotInStr = False
        If InStr(1, strLine, arrLine(i), vbTextCompare) = 0 Then ' Søger efter string
            NotInStr = True
          Exit For
        End If
      Next
      If NotInStr = False Then
        strOut = strOut & strLine & vbCrLf ' Tilføjer string
      End If
    Loop
  f.Close
%>

<%
  Response.Write strOut ' Viser søgningen.
  Response.End
%>
Avatar billede jespernaur Nybegynder
07. december 2002 - 15:25 #1
Du må i hvertfald kunne spare noget ved at flytte opsplitningen af strQ uden for løkken, så du ikke gentager det samme arbejde for hver eneste linie i filen, det kan også være det giver lidt at sætte UBound uden for løkken, altså noget i retning af:

  Dim fso
  Dim f
  Dim strQ
  Dim filespec
  Dim i
  Dim arrLine
  Dim strLine
  Dim NotInStr
  Dim strOut
  Dim numWord

  strQ = Request.Querystring("q") ' Søge string.
  arrLine = Split(strQ, " ") ' Splitter SPACE op
  numWord = UBound(arrLine)

  filespec = Server.Mappath("/search/search.txt") ' Søge i filen.

  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile(filespec, 1)
    Do While Not f.AtEndOfStream
      strLine = f.ReadLine
      For i = 0 To numWord
        NotInStr = False
        If InStr(1, strLine, arrLine(i), vbTextCompare) = 0 Then ' Søger efter string
            NotInStr = True
          Exit For
        End If
      Next
      If NotInStr = False Then
        strOut = strOut & strLine & vbCrLf ' Tilføjer string
      End If
    Loop
  f.Close

Hvis det ikke er nok, skal der tænkes mere kreativt og i den forbindelse er det vigtigt at vide: Er indholdet af search.txt nogenlunde konstant, eller er det nyt indhold hele tiden?

Mvh
Jesper Naur
Avatar billede sjh Nybegynder
07. december 2002 - 19:44 #2
det gav en del men ikke nok, hvad mener du med det sidste min tekst-fil er tekst med linje skift.
Avatar billede jespernaur Nybegynder
07. december 2002 - 20:22 #3
Det jeg mener er følgende: Hvis du er i den situation, at indholdet i search.txt aldrig eller kun sjældent ændrer sig kan du overveje at lave et separat program, der transformerer indholdet i search.txt til en form, der er mere velegnet til at søge på enkelte ord (uanset hvordan vi vender og drejer det: Lineær søgning efter nogle få ord gennem 2 Mb vil aldrig være den mest effektive metode). Der kan evt blive tale om at gemme det i en database, hvor man ved at slå op på et givet ord får udleveret samtlige linier, der indeholder dette ord - det kan dog sikkert også løses uden database, så skal der dog nok arbejdes lidt mere. Min tanke er, at et sådant program skulle køres forfra, hver gang der var en ændring i search.txt - derfor kravet om, at dette ikke må ske for ofte.

Mvh
Jesper Naur
Avatar billede sjh Nybegynder
07. december 2002 - 20:37 #4
Ok, jeg tror jeg nøjes med det gode resutat af din kode :)

da den bliver ændrer ver 2 time af et andet program.

Takker mange gange :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester