Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Library: Object-Pascal / Delphi-Language (https://www.delphipraxis.net/35-library-object-pascal-delphi-language/)
-   -   Delphi String zerlegen/aufsplitten (https://www.delphipraxis.net/26055-string-zerlegen-aufsplitten.html)

SirThornberry 17. Jul 2004 10:32


String zerlegen/aufsplitten
 
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]

CalganX 17. Jul 2004 11:59

Re: String zerlegen/aufsplitten
 
Hi,
ExplodeExplode dürfte es auch tun. ;)

Chris

SirThornberry 17. Jul 2004 12:03

Re: String zerlegen/aufsplitten
 
Performancemäßig ist diese Funktion aber nicht zu empfehlen da mit
Delphi-Quellcode:
vBuffer:=vBuffer+fText[vI];
die größe des Strings jedesmal neu gesetzt wird und somit im schlimmsten Falle bei jedem aufruf der Speicher neu allociert werden muss. Außerdem ist es nicht möglich einen einzelnen Index herauszusplitten. Bei größen Datenmengen ist die Funktion erheblich langsamer (deswegen hab ich vor einiger Zeit auch dazu aufgerufen das meine damalige Function auf Performance hinn verbessert werden soll was auch supi gelungen ist)

[Edit]Hab grad getestet mit einer 40 MB-Datei getestet: meine Splitfunktion=17 Sekunden die andere 21 Sekunden. Ein weiterer Nachteil ist das bei der anderen Funktion nur ein charakter als Delimiter übergeben werden kann[/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz