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^='
O'
then 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;