Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 

String zerlegen/aufsplitten

  Alt 17. Jul 2004, 10:32
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat