![]() |
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:
Beispielaufruf mit Delimiter "|"
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;
Delphi-Quellcode:
Function zum Heraussplitten eines einzelnen Indexes:
var
LZumZerlegen: String; LErgebnis: TStringlist; begin LZumZerlegen := 'Text1|Text2|Text3'; LErgebnis := TStringlist.Create; splitString(LZumZerlegen, '|', LErgebnis); //do something with "LErgebnis" LErgebnis.Free; end;
Delphi-Quellcode:
Beispielaufruf mit Delimiter "|"
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;
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:
Beispielaufruf mit Delimiter "|"
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;
Delphi-Quellcode:
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
var LZumZerlegen: String;
begin LZumZerlegen := 'Text1|Text2|Text3'; ShowMessage(inttostr(SplitsCount(LZumZerlegen, '|')) + ' Einträge sind per Delimiter getrennt.'); end; |
Re: String zerlegen/aufsplitten
|
Re: String zerlegen/aufsplitten
Performancemäßig ist diese Funktion aber nicht zu empfehlen da mit
Delphi-Quellcode:
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)
vBuffer:=vBuffer+fText[vI];
[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 11:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz