Ich hab eine Art Universal-Parser für Texte wie z. B.
Metastase_LK_1_1_1_R_1 geschrieben. Man gibt nur
GetCode('LK', 'Metastase_LK_1_1_1_R_1')
und den gesuchten Code ein, z. B.
LK und die Funktion liefert einen Array of Word mit den passenden Werten zurückt.
Delphi-Quellcode:
type
TCodeW = array of Word;
TCode = record
CodeS: string;
CodeW: TCodeW;
Count: Integer;
CodeSExists: Boolean;
end;
function GetCode(ACodeS, AText: string): TCode;
function GetNum(var s: string): Integer;
var
sTemp: string;
begin
while (Length(s) > 0) and not (s[1] in ['0'..'9']) do
Delete(s, 1, 1);
sTemp := '';
while (Length(s) > 0) and (s[1] in ['0'..'9']) do
begin
sTemp := sTemp + s[1];
Delete(s, 1, 1);
end;
if Length(sTemp) > 0 then
Result := StrToInt(sTemp)
else
Result := -1;
end;
var
i, p: Integer;
w: Integer;
sTemp: String;
begin
with Result do
begin
CodeS := AnsiUpperCase(ACodeS);
SetLength(CodeW, 0);
Count := 0;
CodeSExists := False;
//Evtl. ist es besser nach CodeS + '_' zu suchen, falls immer ein '_' folgt.
p := Pos(CodeS, AnsiUpperCase(AText));
//p := Pos(CodeS + '_', AnsiUpperCase(AText));
CodeSExists := p > 0;
if not CodeSExists then
Exit;
sTemp := '';
for i := p + Length(CodeS) to Length(AText) do
if AText[i] in ['0'..'9', '_'] then
sTemp := sTemp + AText[i]
else
Break;
repeat
w := GetNum(sTemp);
if w > - 1 then
begin
Inc(Count);
SetLength(CodeW, Count);
CodeW[Count - 1] := w;
end;
until w < 0;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Code: TCode;
i: Integer;
begin
Code := GetCode('L', 'Metastase_LK_1_1_1_R_1');
ShowMessage('Gesuchter Code: ' + Code.CodeS);
if Code.CodeSExists then
ShowMessage('Text "' + Code.CodeS + '" ist im String vorhanden')
else
ShowMessage('Text "' + Code.CodeS + '" ist im String nicht vorhanden');
ShowMessage('Anzahl: ' + IntToStr(Code.Count));
for i := 0 to Code.Count - 1 do
ShowMessage('Wert: ' + IntToStr(i + 1) + ' = ' + IntToStr(Code.CodeW[i]));
end;
Soviel ohne genau zu wissen um was es da geht.