Autor |
Beitrag |
Killerwusl
Hält's aus hier
Beiträge: 13
|
Verfasst: Do 10.04.03 16:11
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
      
Beiträge: 312
|
Verfasst: Fr 11.04.03 13:01
Nachdem solange keiner geantwortet hat, will ich mich mal erbarmen  Bin ja schließlich kein Undelp... äh Unmensch
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.
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
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
ShadowCaster
      
Beiträge: 312
|
Verfasst: 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
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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!
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
wulfskin
      
Beiträge: 1349
Erhaltene Danke: 1
Win XP
D5 Pers (SSL), D2005 Pro, C, C#
|
Verfasst: 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; |
_________________ Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
|
|
ShadowCaster
      
Beiträge: 312
|
Verfasst: 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.
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 
Hält's aus hier
Beiträge: 13
|
Verfasst: Sa 12.04.03 08:50
Titel: Danke....
Danke für eure Hilfe. Ich werde mich gleich hinsetzen um das auszuporbiren.
|
|
|