Entwickler-Ecke
Dateizugriff - In Datei nach best. Strings suchen
Killerwusl - Do 10.04.03 16:11
Titel: In Datei nach best. Strings suchen
Hat von euch vielleicht einer eine Idee wie man eine Datei nach bestimmte Strings durchsuchen kann?
Ungefähr wie zB die suche die man mit Str+f aufrufen kann nur ohne das ein dialog aufgeht.
ShadowCaster - Fr 11.04.03 13:01
Nachdem solange keiner geantwortet hat, will ich mich mal erbarmen ;) Bin ja schließlich kein Undelp... äh Unmensch :wink:
Also folgendes: Hier ist eine Lösung von mir, die (wie ich zugeben muss) erstmal eine sehr schlechte Notlösung ist. Ich setz mich gleich nochmal hin und mach ne bessere, wenn ich Zeit hab.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| function FindStringInString(MainString : String; SubString : String) : Integer; var i : Integer; begin Result := 0; for i := 1 to length(MainString) - length(SubString) + 1 do begin if copy(MainString, i, length(SubString)) = SubString then Result := Result + 1; end; end;
function FindStringInFile(DateiName : String; SuchWort : String; var Counter : Integer) : Boolean; var i : Integer; InFile : TStringList; begin Result := False; InFile := TStringList.Create; if FileExists(DateiName) then begin try InFile.LoadFromFile(DateiName); except MessageDlg('Fehler beim Lesen der Datei. Stellen Sie sicher, dass sie nicht schon von einem anderen Programm geöffnet wurde.', mtError, [mbOk], 0); Exit; end; for i := 0 to InFile.Count - 1 do begin Counter := Counter + FindStringInString(InFile.Strings[i], SuchWort); end; end; if Counter > 0 then Result := True; end; |
ACHTUNG: Der Code ist ungetestet und ich weiß nicht wie schnell die Suchfunktion ist. Es ist wie gesagt nur eine billige Notlösung. Das geht mit Sicherheit noch schneller.
wulfskin - Fr 11.04.03 13:50
Hallo Killerwusl!
Je nach dem in was du suchen musst, ist die Prozedur von ShadowCaster richtig oder falsch.
Wenn du in Textdatein suchen willst, dann kannst du diese Prozedur benutzen.
Wenn du auch in anderen Formaten suchen möchtest, dann ist das Zeilenweise einlesen zulangsam und ich denke auch, dass die StringListe den Inhalt nicht richtig wiedergeben kann.
Gruß wulfskin!
ShadowCaster - Fr 11.04.03 13:54
Japp, wulfskin, da geb ich dir recht. Allerdings glaub ich fast, er will so eine Funktion wie in Delphi von Ctrl+F haben ;) Dann würds sogar reichen.
Aber ich kann das ganze ja mal beschleunigen. Werd mich mal an ne bessere Funktion setzen.
Gruß
Shadow
wulfskin - Fr 11.04.03 13:59
ShadowCaster hat folgendes geschrieben: |
Japp, wulfskin, da geb ich dir recht. Allerdings glaub ich fast, er will so eine Funktion wie in Delphi von Ctrl+F haben ;) Dann würds sogar reichen.
Aber ich kann das ganze ja mal beschleunigen. Werd mich mal an ne bessere Funktion setzen.
Gruß
Shadow |
Ich glaub das bekommst du nur schneller hin, wenn du direkt beim einlesen (mit TextFile, Read) suchst, aber ob das auch wirklich sehr viel schneller ist, weiss ich nicht!
Ich mach mal ne Prozedur und messe ;)!
Gruß wulfskim!
wulfskin - Fr 11.04.03 14:04
So mein Vorschlag:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| function FindStringInTextFile(const FileName, SuchWort: String): Boolean; var F: TextFile; S: String; begin Result := FalsE; Assign{File}(F, FileName); Reset(F); while not EoF(F) do begin Readln(F, S); if Pos(SuchWort, S) > 0 then begin Result := True; Close{File}(F); Exit; end; end; Close{File}(F); end; |
ShadowCaster - Fr 11.04.03 16:02
hier eine Funktion von mir, die sehr schnell sein dürft. Ist auch gestest und liefert soviel ich hoffe den richtigen Count von Wörtern zurück. Allerdings stimmt die Schleife nicht ganz, da sie einen Speicherbereich bis 19 Byte über dem mit getmem alloziierten Speicherbereich ausliest. Das muss dann noch abgefangen werden. Mit modulo könnte man da was machen.
also, wie immer sehr quick and dirty geproggt und soll mehr oder weniger nur ein Hinweis sein wie man es schneller machen kann. Ich übernehme keine Garantie über lauffähigkeit und richtigkeit der Ergebnisse.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| function FastFindStringInFile(DateiName : String; SuchWort : String; var Counter : Integer) : Boolean; type TMaxString = String[20]; // maximallänge des Suchstrings ist 20 Zeichen; var i, j : Integer; InFile : File; InBuffer : PChar; Gelesen : Integer; InPos : Pointer; MaxString : TMaxString; begin Result := False; Counter := 0; if FileExists(DateiName) then begin AssignFile(InFile, DateiName); Reset(InFile, 1); GetMem(InBuffer, FileSize(InFile)); BlockRead(InFile, InBuffer^, FileSize(InFile), Gelesen); InPos := Pointer(InBuffer); i := 0; while i < Gelesen do begin MaxString := TMaxString(InPos^); InPos := Pointer(Cardinal(InPos) + length(MaxString) - length(SuchWort) + 1); for j := 1 to length(MaxString) - length(SuchWort) + 1 do begin if Copy(MaxString, j, length(SuchWort)) = SuchWort then Counter := Counter + 1; end; i := i + length(MaxString) - length(SuchWort) + 1; end; FreeMem(InBuffer); CloseFile(InFile); end; end; |
Killerwusl - Sa 12.04.03 08:50
Titel: Danke....
Danke für eure Hilfe. Ich werde mich gleich hinsetzen um das auszuporbiren.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!