Autor Beitrag
Killerwusl
Hält's aus hier
Beiträge: 13



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: 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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Fr 11.04.03 14:04 
So mein Vorschlag:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 312



BeitragVerfasst: 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.


ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Sa 12.04.03 08:50 
Titel: Danke....
Danke für eure Hilfe. Ich werde mich gleich hinsetzen um das auszuporbiren.