webForumDet fria alternativet

Modefiering utav kod (textfiler och pattern)

4 svar · 492 visningar · startad av calson

calsonMedlem sedan dec. 2003487 inlägg
#1

Hej jag har knåpat ihop en kod med mening att söka igenom ett hundratal textfiler och hämta ut viss information.. Problemet är att det ochså är relativt stora textfiler.. Mitt webhotell har satt en script.limit - vilket är absolut förståligt - därför måste jag modifiera min kod till det bättre för att eventuellt kunna läsa igenom alla textfiler eller klara av så många som möjligt per del-inläsning.

Jag har fått mycket hjälp av att söka här på forumet men mycket har jag gjort själv vilket får mig tro att någon här kan hitta en eller annan förbättring för att få skriptet att gå smidigare.. Jag har satt lite kommentarer till det relevanta för att folk ska förstå snabbt vad saker och ting gör.

<%
Dim intObjFSO, objTS
Dim arrText

  Dim i
Dim intCount, intV, strL, intHtml
Dim m
Dim re
Dim errExit

Set objFSO = Server.CreateObject("Scripting.FileSystemObject")

  y = 0
  intX = 150864

errExit = ""
Do Until errExit = "True"

  y = y + 1
  intX = intX + 1

  On Error Resume Next

  Set objTS = objFSO.OpenTextFile(Server.MapPath("newsT\" & intX & ".txt")) [B]' Öppnar textfilen[/B]
  arrText = Split(objTS.ReadAll, vbCrLf) [B]' Läser in allt[/B]

  objTS.Close

[B]  'Skapar ett mönster[/B]
  set re = new regexp
  re.global  = true
  re.pattern = "\(#(.*?)\)"

  intCount = 0

 If (Err.Number = 0) Then [B]' Om filen existerar[/B]

  For i = 0 To UBound(arrText) [B]' Sök igenom alla rader i textfilen[/B]

    intT = mid(arrText(i),92,1) [B]' Hämtar ut ett nummer från textraden[/B]
    intV = mid(arrText(i),12,30) [B]' Hämtar ut ett flersiffrigt nummer från[/B] textraden

    set m = re.execute(intV) [B]' Hämtar den aktuella informationen från intV[/B]
      if m.count>0 then [B]' Om informationen finns att hämta spara den[/B]
        intHTML=m(0).submatches(0)
      End If

      If intT > int(2) And intHtml = 2960 Then [B]' Om nummret från intT är större än 2 och intHTML är 2960[/B]
	intCount = intCount + 1 [B]' Addera resultatet med 1[/B]
      End If

  Next

 Else ' Om filen ej finns stäng loopen
  response.write("<b>Reading from source failed...</b>")
  errExit = "True"
 End If

    m.close
    re.close

    response.write("<b>" & intCount & "</b> hits for (#2960)<br>") [B]' Skriver ut resultatet efter varje genomsökt textfil [/B]

Loop

Set objTS = Nothing
Set m = nothing
Set re = nothing

Set objFSO = Nothing
%>

Tack på förhand

@ndersMedlem sedan juni 200032 969 inlägg
#2

Mitt webhotell har satt en script.limit - vilket är sbsolut förståligt - därför måste jag modifiera min kod till det bättre för att eventuellt kunna läsa igenom alla textfiler eller klara av så många som möjligt per del-inläsning.

Kan du inte bara ställa upp Server.ScriptTimeout i din asp-fil?

calsonMedlem sedan dec. 2003487 inlägg
#3

jo där har du rätt - Tack (y)

men jag skulle inte ha något emot om någon kunde hitta något för att förbättra koden.. Har jag gjort rätt med alla stängningar av objekt tex?

calsonMedlem sedan dec. 2003487 inlägg
#4

Det fungerar aldeles utmärkt när jag ändrat timeout men jag kommer titta in här lite då och då för att se om jag kan förbättra något :)

calsonMedlem sedan dec. 2003487 inlägg
#5

en till fråga angående detta.
Jag vill kolla om det längre numret i varje rad är lika dant som i en databas. Som sagt är textfilerna långa och inehåller många rader så det blir en jäkla massa tabellöppningar.. Jag prövade med att lägga in en till array men det slutade med en iendlig loop..

Någon som vet hur man använder sig av två arrays tillsammans eller vet någon annan lösning.. Som det ser ut nu blir det fruktansvärt många tabellöppningar vilket slöar ner sidan tusenfaldt.

errExit = ""
Do Until errExit = "True"

  y = y + 1
  intX = intX + 1

  On Error Resume Next

  Set objTS = objFSO.OpenTextFile(Server.MapPath("newsT\" & intX & ".txt")) ' Öppnar textfilen
  arrText = Split(objTS.ReadAll, vbCrLf) ' Läser in allt

    response.write("Reading file...<br>")

  objTS.Close

  'Sätter ett mönster
  set re = new regexp
  re.global  = true
  re.pattern = "\(#(.*?)\)"

  intCount = 0

 If (Err.Number = 0) Then ' Om filen existerar

  For i = 0 To UBound(arrText) ' Sök igenom alla rader i textfilen

    intT = mid(arrText(i),92,1) ' Hämtar ut ett nummer från textraden
    intV = mid(arrText(i),12,30) ' Hämtar ut ett flersiffrigt nummer från textraden

    set m = re.execute(intV) ' Hämtar den aktuella informationen från intV
      if m.count>0 then ' Om informationen finns att hämta spara den
        intHTML=m(0).submatches(0)
      End If

          If intT > 2 Then ' Om nummret från intT är större än 2 och intHTML är 2960

	    
[b]	    strSql=("Select intCountry From tblCountries Where intCountry=" &intHTML)
	    Set objRs = objConr.execute(strSql)
	    strRsOpen = "True"

	    If Not objRs.Eof Then
	      Response.write("Updating database...")
	      objConr.execute("Update tblCountries Set intHits=intHits+1 Where intCountry=" & objRs("intCountry"))
	      response.write(objRs("intCountry") & " - ")
	      Response.write("<b>.......................................Database Updated..........................................</b><br>")
	    End If

	    objRs.Close[/b]

          End If

  Next

 Else ' Om filen ej finns stäng loopen
  response.write("<b>Reading from source failed...</b>")
  errExit = "True"
 End If

    m.close
    re.close

Loop
130 ms totalt · 3 externa anrop · v20260731065814-full.86db40fa
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)