Re: Wie sucht man möglichst schnell Strings in einer Datei?
Verfasst: 30.03.2013 13:26
Hier ist noch meine Version um Strings in Dateien möglichst effizient zu suchen. Dabei gibt meine Funktion eine Liste aller Positionen des Strings in der Datei zurück:
Code: Alles auswählen
EnableExplicit
Procedure FileToMemory(file.s, *fileSize.Integer = 0)
Protected *memory
Protected fileId.i
Protected fileSize.i
If (*fileSize)
*fileSize\i = 0
EndIf
fileId = ReadFile(#PB_Any, file)
If (Not fileId)
ProcedureReturn #False
EndIf
fileSize = Lof(fileId)
*memory = AllocateMemory(fileSize, #PB_Memory_NoClear)
If (Not *memory)
CloseFile(fileId)
ProcedureReturn #False
EndIf
If (ReadData(fileId, *memory, fileSize) <> fileSize)
CloseFile(fileId)
FreeMemory(*memory)
ProcedureReturn #False
EndIf
CloseFile(fileId)
If (*fileSize)
*fileSize\i = fileSize
EndIf
ProcedureReturn *memory
EndProcedure
Procedure FindStringInFile(file.s, stringToFind.s, List positions.i())
Protected *memory, fileSize.i, *f.Ascii, *s.Ascii, stringLength.i
*memory = FileToMemory(file, @fileSize)
If (Not *memory)
ProcedureReturn #False
EndIf
stringLength = Len(stringToFind)
fileSize - stringLength + 1
*f = *memory
*s = @stringToFind
While (fileSize)
fileSize - 1
While (*f\a = *s\a)
*f + 1
*s + 1
Wend
If (*s\a = 0)
If AddElement(positions())
positions() = *f - stringLength - *memory
EndIf
*f - 1
EndIf
*s = @stringToFind
*f + 1
Wend
FreeMemory(*memory)
ProcedureReturn #True
EndProcedure
NewList positions.i()
FindStringInFile("/home/nicolas/tmp/test.txt", "Level", positions())
ForEach positions()
Debug positions()
Next