AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

String zerlegen/aufsplitten

Ein Thema von SirThornberry · begonnen am 17. Jul 2004 · letzter Beitrag vom 17. Jul 2004
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

String zerlegen/aufsplitten

  Alt 17. Jul 2004, 11: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
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: String zerlegen/aufsplitten

  Alt 17. Jul 2004, 12:59
Hi,
ExplodeExplode dürfte es auch tun.

Chris
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: String zerlegen/aufsplitten

  Alt 17. Jul 2004, 13:03
Performancemäßig ist diese Funktion aber nicht zu empfehlen da mit
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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