Seite 2 von 2

Re: Wie sucht man möglichst schnell Strings in einer Datei?

Verfasst: 30.03.2013 13:26
von NicTheQuick
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

Re: Wie sucht man möglichst schnell Strings in einer Datei?

Verfasst: 30.03.2013 13:38
von OlderCoder
'Tschuldigung NicTheQuick, Deinen Post vorhin mit dem Suffixbaum muss ich übersehen haben.
Ich schau mirs mal an. Aber es wirkt auf den ersten Blick recht kompliziert und umfangreich. Ein paar Zeilen Code wären mir lieber. Mal sehen, ob es sich lohnt.

Re: Wie sucht man möglichst schnell Strings in einer Datei?

Verfasst: 30.03.2013 13:50
von OlderCoder
Also sehr schnell ist das schon mal. Wenn es jetzt auch noch korrekt arbeitet (ich bin jetzt schon mehreren Beispielen begegnet, die letztlich fehlerhaft arbeiten, was man aber zunächst nicht unbedingt merkt).
Aber auch hier müsste ich die Funktion mit den Großbuchstaben=Kleinbuchstaben irgendwie integrieren, was mir nur möglich ist, wenn ich das Ganze komplett verstehe.
Und das ist für mich zunächst doch eine recht umfangreiche Blackbox, und die Einarbeitungszeit vermutlich zu lang.
Sicher ein interessantes Verfahren das ich mir später mal anschauen sollte. Trotzdem vielen Dank!!
Aber die Methode von matbal ist für mich im Moment vielleicht doch leichter zu überschauen und in mein Programm zu integrieren. Mal sehen.

Re: Wie sucht man möglichst schnell Strings in einer Datei?

Verfasst: 30.03.2013 13:54
von Kiffi
OlderCoder hat geschrieben:Und für meine Nebenfrage wegen dem Auslesen von pdf und Word-Dateien gibt es vermutlich keine einfache Lösung, oder?
Word-Dateien kannst Du mit COMate öffnen und durchsuchen. Allerdings muss
dann auch Word (oder ein ähnlich automatisierbares Office-Paket) auf dem
ausführenden Rechner installiert sein. Für PDF wüsste ich adhoc keine
schnelle Lösung.

Grüße ... Kiffi

Edit: Für PDF eignet sich u.U. XPDF

Re: Wie sucht man möglichst schnell Strings in einer Datei?

Verfasst: 30.03.2013 14:16
von OlderCoder
Danke! Dann lass ich das wohl lieber.
Es wäre eine feine Sache gewesen, einfach so auch in .doc-, .docx- und besonders in .pdf-Dateien (da hab ich viele von) nach einem Begriff suchen zu können. Aber es muss nicht sein.
Ich möchte auch das Programm mal weitergeben, und nicht jeder hat Word.