Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.062 Beiträge
 
Delphi XE2 Professional
 
#15

AW: String Code überprüfen

  Alt 20. Jul 2012, 00:11
Hallo lemomo,

wie Bummi schon ausdrückte ist deine Beschreibung des Problems recht dürftig.

Du schriebst in #1
"Es muss auch überprüft werden ob unser String auf die erste Reihe geschrieben ist"
In #8 schriebst du
"d.h vor der O1- oder O3 muss nicht leer sein"

Den Satz aus #1 interpretiere ich so, dass die "Oxx" linksbündig angeordnet sein müssen.
Dagegen den Satz aus #8 verstehe ich so, dass davor Leerzeichen stehen dürfen.

Wie auch immer, da mich das interessierte, habe ich eine Prozedur geschrieben, die die Prüfungen ausführt.

Ist etwas länger, dafür recht flink. Für eine 25 MB Datei < 100 ms.

Delphi-Quellcode:
PROCEDURE CheckText(const s:string; CheckLeadingBlanks:boolean);
var p:PChar;
PROCEDURE NextLine;
begin
   while not CharInSet(p^,[#0,#10,#13]) do inc(p);
   while CharInSet(p^,[#10,#13]) do inc(p);
end;
FUNCTION ReadNumber:integer;
const max1=MaxInt div 10; max2=MaxInt-max1*10;
var c:integer;
begin
   result:=0;
   while CharInSet(p^,['0'..'9']) do begin
      c:=Ord(p^)-Ord('0');
      if (result>max1) or ((result=Max1) and (c>max2)) then
         raise Exception.Create('Zahlenüberlauf');
      result:=result*10+c;
      inc(p);
   end;
end;
FUNCTION Find_Ox(var value:integer):boolean;
var HasLeadingBlanks:boolean;
begin
   repeat
      hasleadingblanks:=p^=' ';
      while p^=' do inc(p); // Blanks am Zeilenanfang übergehen
      if p^='Othen begin // O gefunden
         inc(p);
         if CharInSet(p^,['0'..'9']) then begin
            value:=ReadNumber;
            if CheckLeadingBlanks and HasLeadingBlanks then
               raise Exception.Create('"O'+IntToStr(value)+'" ist nicht linksbündig.');
            NextLine;
            Exit(true);
         end else begin
            raise Exception.Create('Keine Ziffer hinter "O".');
         end;
      end;
      NextLine;
   until p^=#0;
   result:=false;
end;
var n,k:integer; ss:string;
begin
   p:=@s[1]; // Zeigt auf erstes Zeichen im String
   try
      if not Find_Ox(n) then
         raise Exception.Create('Kein "O" gefunden, dem eine Zahl folgt');
      while Find_Ox(k) do
         if k=n+1 then begin
            n:=k
         end else begin
            ss:='Nach "O'+IntToStr(n)+'" folgt "O'+IntToStr(k)+'".';
            raise Exception.Create(ss);
         end;
      ShowMessage('OK');
   except
      on E:Exception do ShowMessage(E.Message);
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var list:TStrings;
begin
   list:=TStringList.Create;
   try
      try
         list.LoadFromFile('text1.txt');
         CheckText(list.Text,false);
      except
         On E:Exception do ShowMessage(E.Message);
      end;
   finally
      list.free;
   end;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat