Hallo liebe Community,
Ich will zur Zeit ein logfile auslesen ( 370000 Zeilen).
Dabei brauche ich nur bestimmte Teile des Logfiles ( immer der selbe String).
Hier mal das momentane Script:
Spoiler anzeigen
#include <Constants.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <Arraymore.au3>
#include <Array.au3>
_SQLite_Startup()
$t = _SQLite_Open(@ScriptDir & "\" & "Datenbank.db")
$path = "C:\Temp\20111107.log"
$hFile = FileOpen($path, 0)
$read = FileRead($hFile)
$Splitcount = StringSplit($read, "Trennstring", 1)
$cnt = $Splitcount[0]
$Splitcount = ""
ProgressOn("Log Datei lesen", "Log Datei wird eingelesen")
For $i = 1 To $cnt+1
ProgressSet($i/($cnt+1) * 100)
$findkamp = StringInStr($read, "Trennstring", 0, $i)
If @error = 1 Or $findkamp = 0 Then
ProgressOff()
Exit
EndIf
FileSetPos($hFile, $findkamp - 77, $FILE_BEGIN)
$Time = FileRead($hFile, 19)
$find2 = StringInStr($read, "Statistic:", 0, 1, $findkamp, 150)
If $find2 <> "" Then
$Timesplit = Stringsplit($Time, " ")
$Date = $Timesplit[1]
$Uhrzeit = $Timesplit[2]
$findlast = StringInStr($read, "RunningTime", 0, 1, $find2 + 13)
FileSetPos($hFile, $find2 + 13, $FILE_BEGIN)
$readinhalt = FileRead($hFile, $findlast - 5 - $find2 + 13)
$Split = Stringsplit($readinhalt, @CRLF)
$Columns = "Datum,UHRZEIT"
For $k = 1 To $Split[0]
If $Split[$k] = "" THen ContinueLoop
$tmpsplit = Stringsplit($Split[$k], " = ", 1)
$Columns &= ","&$tmpsplit[1]
Next
$txt = 'Begin Transaction ;' & @CRLF
$txt &="INSERT INTO Daten ("&$Columns&") VALUES ('"&$Date&"','"&$Uhrzeit&"'"
For $k = 1 To $Split[0]
If $Split[$k] = "" THen ContinueLoop
$tmpsplit = Stringsplit($Split[$k], " = ", 1)
$txt &= ", '"&$tmpsplit[2]&"'"
Next
$txt &= ");"&@CRLF
$txt &= 'Commit Transaction ;' & @CRLF
_SQLite_Exec(-1, $txt)
_SQLite_Exec(-1, "DELETE FROM Daten WHERE AgentCount = '0';")
Else
ContinueLoop
EndIf
Wie ihr seht arbeite ich im moment mit
[autoit]StringInStr($read, "Trennstring", 0, $i)
[/autoit]
Damit wird immer wieder die gesamte Datei durchsucht, bis zum x-ten Vorkommen des Trennstrings.
Jetzt hatte ich überlegt, ob ich nicht vom Beginn der Datei bis zu $findlast, also dem letzten Zeichen das ich brauche, alles lösche und dann von vorne beginne. Damit sollte dann ja die Laufzeit kürzer werden, da der String kleiner ist (richtig?)
Ich denke ich muss mit FileSetPos arbeiten, weiß aber nicht, wie ich dann etwas lösche, überschreiben steht ja in der Hilfe.
Weiß jemand wie das funktionieren könnte oder hat eine bessere Idee?
Das Programm an sich funktioniert, es dauert nur fast 10 Minuten pro Datei und das ist mir eindeutig zu langsam