12 Mei 2009

Cari Text dalam Text File

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
Edit1: TEdit;
SpeedButton1: TSpeedButton;
procedure SpeedButton1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

// Aus einem alten c't-Heft von C nach Delphi übersetzt
//
// Deklarationsteil

Procedure Ts_init(P : Pchar; m : integer);
Function Ts_Search(Text,p:Pchar;m:Integer;Start:Longint):Longint;


//GLOBALE VARIABLEN
//*****************

var

shift : Array[0..255] of Byte; // Shifttabelle für Turbosearch
Look_At : integer; // Look_At-Position für Turbosearch



implementation

{$R *.DFM}

Procedure Ts_init(P : Pchar; m : integer);
var
i : integer;
begin
// *** Suchmuster analysieren ****

{1.} for i := 0 to 255 do shift[i] := m+1;
{2.} for i := 0 to m-1 do Shift[Ord(p[i])] := m-i;

Look_at := 0;

{3.} While (look_At < h =" ASCII-Wert" a =" 97d" n =" 110d" s =" 115d"> p[i]) do t := t+shift[ord(t[m])];

i := i-1; // Vergleichszeiger auf vorletztes Zeichen setzen
If i < i =" -1" i="0"> Sprung um max. 2*m
If Result = -1 then t := t+Look_AT+shift[Ord(t[m+look_at])];

until Result <> -1; // Repeat
end;


// Such-Procedure auslösen (hier beim drücken eines Speedbuttons auf FORM1)

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
tt : String;
L : Integer;
L2,sp,a : Longint;
F: file; // File-Alias
Size: Integer; // Textlänge
Buffer: Pchar; // Text-Memory-Buffer
begin
tt := Edit1.Text; // Suchmuster
L := Length(TT); // Suchmusterlänge

ts_init(Pchar(TT),L); // Sprungtabelle für Suchmuster initialisieren
try
AssignFile(F, 'test.txt');
Reset(F, 1); // File öffnen
Size := FileSize(F); // Filegrösse ermitteln
GetMem(Buffer, Size+L+1); // Memory reservieren in der Grösse von
// TextFilelänge+Musterlänge+1
try
BlockRead(F, Buffer^, Size); // Filedaten in den Buffer füllen
StrCat(Buffer,Pchar(TT)); // Suchmuster ans Ende des Textes anhängen
// damit der Suchalgorythmus keine Fileende-
// Kontrolle machen muss.
// Turbo-Search

SP := 0; // Startpunkt der Suche im Text
A := 0; // Anzahl-gefunden-Zähler

While SP < Size do begin
L2 := Ts_Search(Buffer,Pchar(TT),L,SP); // L = Musterlänge
// SP= Startposition im Text

SP := L2+L; // StartPosition auf Letzte gefundene Position+Musterlänge
Inc(a); // Anzahl gefunden Zähler

end;

// Am Schluss nicht vergessen Buffer freigeben und Inputfile schliessen
finally
FreeMem(Buffer); // Memory freigeben.
end;
finally
CloseFile(F); // Datei schliessen.
end;
end;

end.