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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

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

Beitrag 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
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

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

Beitrag 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.
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

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

Beitrag 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.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

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

Beitrag 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
a²+b²=mc²
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

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

Beitrag 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.
Antworten