Da immer wieder fragen zum zerlegen/(auf)splitten von Strings kommen werd ich mal meine Funktionen verewigen. Mit den Funktionen/Proceduren kann ein String anhand eines Delimiters zerlegt werden und in eine Stringlist gepackt werden, ein einzelner Index heraus gesplittet werden oder die Anzahl der getrennten Einträge ermittelt werden. Zwar kann dies auch mit einer Stringlist realiert werden allerdings gibt es diese soweit ich weiß nicht in allen Delphiversionen (also erst ab einer gewissen Versionsnummer).
Procedure zum zerlegen eines Strings mit rückgabe als Stringlist:
Delphi-Quellcode:
procedure splitString(const Source: String; const Delimiter: String; const Dest: TStringlist);
var
count: Integer;
LStartpos, LEndepos, LSourcelength: Integer;
LDelimiterLength : Integer;
begin
Dest.Clear;
count := 1;
LStartpos := 0;
LEndepos := 0;
LSourcelength := length(Source);
LDelimiterLength := Length(Delimiter);
while count <= LSourcelength do
begin
if copy(Source, count, LDelimiterLength) = Delimiter then
begin
LEndepos := count;
dest.Add(copy(Source, LStartpos + 1, LEndepos - LStartpos - 1));
LStartpos := count + LDelimiterLength - 1;
inc(count,LDelimiterLength);
end else
begin
inc(count);
end;
end;
if LEndePos <> Count - LDelimiterLength then
dest.Add(copy(Source, LStartpos + 1, count - LStartpos - 1));
end;
Beispielaufruf mit Delimiter "|"
Delphi-Quellcode:
var
LZumZerlegen: String;
LErgebnis: TStringlist;
begin
LZumZerlegen := 'Text1|Text2|Text3';
LErgebnis := TStringlist.Create;
splitString(LZumZerlegen, '|', LErgebnis);
//do something with "LErgebnis"
LErgebnis.Free;
end;
Function zum Heraussplitten eines einzelnen Indexes:
Delphi-Quellcode:
function splitOutIndex(const Source: String; const Delimiter: String; Index: Integer): String;
var
Lcount, Lnumber, LSourceLength, LDelLength, LStart, LEnd: Integer;
begin
LCount := 1;
Lnumber := 0;
if Index = 0 then LStart := 1 else LStart := 0;
LEnd := 0;
result := '';
LSourceLength := length(Source);
LDelLength := length(Delimiter);
while (LCount <= LSourceLength) and (LEnd = 0) do
begin
if copy(Source, LCount, LDelLength) = Delimiter then
begin
inc(LNumber);
if LNumber >= Index then
begin
if LStart = 0 then
LStart := LCount + LDelLength
else
begin
LEnd := LCount;
result := copy(Source, LStart, LEnd - LStart);
end;
end;
Lcount := Lcount + LDelLength;
end else inc(LCount);
end;
if (LStart > 0) and (LEnd = 0) then
result := copy(Source, LStart, LSourceLength - LStart + 1);
end;
Beispielaufruf mit Delimiter "|"
Delphi-Quellcode:
var
LZumZerlegen: String;
begin
LZumZerlegen := 'Text1|Text2|Text3';
ShowMessage(SplitOutIndex(LZumZerlegen, '|', 1)); //Zeigt "Text2"
end;
Function zum ermitteln der Anzahl der Einträge die per Delimiter getrennt sind:
Delphi-Quellcode:
function splitscount(const Source: String; const Delimiter: String): Integer;
var
LSourceLen, LDelLen, LPos: Integer;
begin
result := 0;
LPos := 1;
LSourceLen := length(Source);
LDelLen := length(Delimiter);
while LPos <= LSourceLen do
begin
if copy(Source, LPos, LDelLen) = Delimiter then
begin
inc(result);
inc(LPos, LDelLen);
end else inc(LPos);
end;
if copy(Source, LSourceLen-LDelLen+1, LDelLen) <> Delimiter then
inc(result);
end;
Beispielaufruf mit Delimiter "|"
Delphi-Quellcode:
var LZumZerlegen: String;
begin
LZumZerlegen := 'Text1|Text2|Text3';
ShowMessage(inttostr(SplitsCount(LZumZerlegen, '|')) + ' Einträge sind per Delimiter getrennt.');
end;
[edit=Matze]Code formatiert. Mfg, Matze[/edit]