// Eine Textdatei
wird nach Vorkommen einer Zeichenfolge durchsucht. // Getestet mit RS 10.4 unter
W11 var zeilen: array of integer; function finde_in(Datei, wort: string; gleicheSchreibweise, nurGanzesWort, Einzelabfrage: boolean): integer; var sl: TStringList; x, lg, kml, zl, stelle: integer; z: String; function box(txt: string; bttn: uint): integer; begin result := application.messagebox(pchar(txt), pchar('Textsuche in ' + extractfilename(Datei)), bttn); end; function buchst(c: char): boolean; begin result := CharInSet(c, ['A' .. 'Z', 'a' .. 'z', '0' .. '9', 'Ä', 'Ö', 'Ü', 'ä', 'ö', 'ü', 'ß']); end; function davor(i: integer): boolean; begin if i = 1 then begin result := true; exit; end; result := not buchst(sl[x][i - 1]); end; function danach(i: integer): boolean; begin inc(i, lg); if i > length(sl[x]) then begin result := true; exit; end; result := not buchst(sl[x][i]); end; function da(ss: string): integer; var y: integer; begin result := 0; kml := 0; repeat y := pos(wort, ss); if y > 0 then begin if nurGanzesWort then begin kml := kml + y; if davor(kml) and danach(kml) then inc(result); end else inc(result); ss := copy(ss, y + lg, length(ss)); kml := kml + lg - 1; end; until y = 0; end; begin result := 0; zeilen := nil; stelle := 0; lg := length(wort); if lg = 0 then exit; if not gleicheSchreibweise then wort := ansilowercase(wort); sl := TStringList.create; try sl.LoadFromFile(Datei, TEncoding.UTF8); except sl.LoadFromFile(Datei); end; if sl.count > 0 then for x := 0 to sl.count - 1 do begin if not gleicheSchreibweise then sl[x] := ansilowercase(sl[x]); zl := da(sl[x]); if zl > 0 then begin result := result + zl; setlength(zeilen, stelle + 1); zeilen[stelle] := x + 1; inc(stelle); if zl = 1 then z := '' else z := #32 + inttostr(zl) + 'x'; if Einzelabfrage then if box('"' + wort + '"' + z + ' in Zeile ' + inttostr(x + 1) + ' gefunden'#13'Weiter suchen?', mb_yesno) = idno then begin sl.free; exit; end; end; end; sl.free; if Einzelabfrage then begin if stelle = 0 then box('"' + wort + '" nicht gefunden', mb_ok) else box('Bis zum Ende durchsucht. '#13' "' + wort + '" ' + inttostr(result) + ' mal gefunden.', mb_ok) end; end; function suche_in(Datei, suchbegriff: string; gleicheSchreibweise, nurGanzesWort, Einzelabfrage: boolean): string; var i, j, k: integer; s: string; begin if fileexists(Datei) then begin i := finde_in(Datei, suchbegriff, gleicheSchreibweise, nurGanzesWort, Einzelabfrage); k := length(zeilen) - 1; if k = 0 then s := 'Zeile ' else s := 'den Zeilen '; for j := 0 to k do begin s := s + inttostr(zeilen[j]); if j = k - 1 then s := s + ' und ' else if j <> k then s := s + ', '; end; case i of 0: result := 'Nichts gefunden.'; 1: result := 'Begriff einmal in ' + s + ' gefunden.'; else result := 'Begriff insgesamt ' + inttostr(i) + ' mal in ' + s + ' gefunden.'; end; end else result := 'Datei nicht gefunden.'; end; // ------ Beispielaufrufe ------------- // Das Gesamtsuchergebnis wird in Label1 angezeigt procedure TForm1.Button1Click(Sender: TObject); begin suche_in('D:\Test1.txt', 'Zeichen', false, false, true); end; // Bei jedem gefundenen Begriff wird die entsprechende Zeile // angezeigt und "Weitersuchen" abgefragt procedure TForm1.Button2Click(Sender: TObject); begin Label1.caption := suche_in('D:\Test2.txt', 'zeichen', false, false, false); end;
//------------------------------------------------------------ // Alte
Variante (nur geringfügig anders) var zeilen: array of integer; function finde_in(datei, wort: string; gleicheSchreibweise, nurGanzesWort, Einzelabfrage: boolean): integer; var sl: TStringList; x, lg, kml, zl, stelle: integer; function box(txt: string; bttn: uint): integer; begin result := application.messagebox(pchar(txt), pchar('Textsuche in ' + extractfilename(datei)), bttn); end; function buchst(c: char): boolean; begin result := c in ['A'..'Z', 'a'..'z', '0'..'9', 'Ä', 'Ö', 'Ü', 'ä', 'ö', 'ü', 'ß']; end; function davor(i: integer): boolean; begin if i = 1 then begin result := true; exit; end; result := not buchst(sl[x][i - 1]); end; function danach(i: integer): boolean; begin inc(i, lg); if i > length(sl[x]) then begin result := true; exit; end; result := not buchst(sl[x][i]); end; function da(ss: string): integer; var y: integer; begin result := 0; kml := 0; repeat y := pos(wort, ss); if y > 0 then begin if nurGanzesWort then begin kml := kml + y; if davor(kml) and danach(kml) then inc(result); end else inc(result); ss := copy(ss, y + lg, length(ss)); kml := kml + lg - 1; end; until y = 0; end; begin result := 0; zeilen := nil; stelle := 0; lg := length(wort); if lg = 0 then exit; if not gleicheschreibweise then wort := ansilowercase(wort); sl := TStringList.create; sl.loadfromfile(datei); if sl.count > 0 then for x := 0 to sl.count - 1 do begin if not gleicheschreibweise then sl[x] := ansilowercase(sl[x]); zl := da(sl[x]); if zl > 0 then begin result := result + zl; setlength(zeilen, stelle + 1); zeilen[stelle] := x + 1; inc(stelle); if Einzelabfrage then if box('"' + wort + '" in Zeile ' + inttostr(x + 1) + ' gefunden'#13'Weiter suchen?', mb_yesno) = idno then begin sl.free; exit; end; end; end; sl.free; if Einzelabfrage then begin if stelle = 0 then box('"' + wort + '" nicht gefunden', mb_ok) else box('Bis zum Ende durchsucht. '#13' "' + wort + '" ' + inttostr(result) + ' mal gefunden.', mb_ok) end; end; function suche_in(datei, suchbegriff: string; gleicheSchreibweise, nurGanzesWort, Einzelabfrage: boolean): string; var i, j, k: integer; s: string; begin if fileexists(datei) then begin i := finde_in(datei, suchbegriff, gleicheSchreibweise, nurGanzesWort, Einzelabfrage); k := length(zeilen) - 1; if k = 0 then s := 'Zeile ' else s := 'den Zeilen '; for j := 0 to k do begin s := s + inttostr(zeilen[j]); if j = k - 1 then s := s + ' und ' else if j <> k then s := s + ', '; end; case i of 0: result := 'Nichts gefunden.'; 1: result := 'Begriff einmal in ' + s + ' gefunden.'; else result := 'Begriff insgesamt ' + inttostr(i) + ' mal in ' + s + ' gefunden.'; end; end else result := 'Datei nicht gefunden.'; end; // ------ Beispielaufrufe ------------- // Das Gesamtsuchergebnis wird in Label1 angezeigt procedure TForm1.Button7Click(Sender: TObject); begin label1.caption := suche_in('c:\test.txt', 'der', false, false, false); end; // Bei jedem gefundenen Begriff wird die entsprechende Zeile // angezeigt und "Weitersuchen" abgefragt procedure TForm1.Button8Click(Sender: TObject); begin suche_in('c:\autoexec.bat', 'SET', false, false, true); end;
|