![]() |
Split-Funktion in Delpi???
Hallo Wissende,
ich habe eine Zeile mit Text, welche ich mit einem Trenner ($$) versehen geschrieben habe. Die Inhalte hole ich aus einem Stringgrid.(z.B. text1$$text2$$text3) Nun will ich diesen Inhalt wieder einlesen und weiss nicht genau wie!? In VBS gibt es da eine Splitfunktion, die mir dann einen Array zurück gibt. Wie macht man´s im Delphi? Danke für die Infos Unter Split habe ich leider nichts passendes gefunden. Tom |
Die Funktion musst Du Dir von Hand schreiben, ist aber nicht schwer. Nicht getestet, sollte aber funktionieren.
Delphi-Quellcode:
...:cat:...
// ein paar ansätze
type TStringArray = array of String; function Split(InStr, SplitAt: String): TStringArray; var I, L: Integer; begin SetLength(Result, 0); if InStr = '' then Exit; I := Pos(SplitAt, InStr); L := Length(SplitAt); while I > 0 do begin SetLength(Result, Succ(Length(Result))); Result[High(Result)] := Copy(InStr, 1, Pred(I)); Delete(InStr, 1, Pred(I + L)); I := Pos(SplitAt, InStr); end; end; .... var I: Integer; Strings: TStringArray; begin Strings := Split('text1$$text2$$text3', '$$'); if Length(Strings) > 0 then for I := Low(Strings) to High(Strings) do ShowMessage(Strings[I]); end; |
Hi Sakura,
vielen Dank erst einmal. Ich werde es umgehend testen und hoffe auf Erfolg. Tom |
|
ich hab schon mal son code gepostet und zwar viel kürzer:
Delphi-Quellcode:
function Split(sString, sDelimeter:String):TStringList;
var Res:TStringList; begin Res := TStringList.Create; Res.Text := StringReplace(sString, sDelimeter, #13#10, [rfIgnoreCase, rfReplaceAll]); Result := Res; Res.Free; end; |
@BasicMaster:
Ein paar Probleme:
Code:
...:cat:...
function Split(sString, sDelimeter:String):TStringList;
var Res:TStringList; begin Res := TStringList.Create; [color=#ff0000]// was ist mit bereits vorhandenen Zeilenumbrüchen, sollten diese gebraucht werden?[/color] [color=#ff0000]// string-replace gibt es erst ab D6 und ist EXTREM langsam[/color] Res.Text := StringReplace(sString, sDelimeter, #13#10, [rfIgnoreCase, rfReplaceAll]); Result := Res; [color=#ff0000]// damit ist aber auch das Ergebnis gelöscht![/color] Res.Free; end; |
Moin sakura,
StringReplace ist auch schon meinem D5 bekannt. Das mit dem #13#10 dürfte in diesem Falle auch kein Problem darstellen, da die Daten ja Zeilenweise kommen, und innerhalb eine Zeile ja schlecht ein #13#10 stehen kann. |
Okay, Delphi 5 ist akzeptiert. Zeilenweise u.U., denke man mal an die verschiedenen Arten einen Zeilenumbruch zu bringen (#10, #13#10, und #10#13) dann kann es dennoch zu Problemen führen, denke ich mal. Aber akzeptiert. ;-)
...:cat:... |
Re: Split-Funktion in Delpi???
Ok, gutes Beispiel, aber da hätte ich mal eine Frage sakura:
Wenn ich dein Beispiel ausführe zeigt er nur text1 und text2 mit ShowMessage an! text3 aber nicht! Erst wenn ich hinter dem text3 noch ein $$ einfüge erscheint auch dies. Ich habe jetzt aber eine Textdatei wie folgt: z.B. 12,45 45,78 12,34 23,6 usw. also Koordinaten - ich lese sie mit Readln aus der Datei und dann? Wenn ich deine Funktion nutze bekomme ich mit dem Delimeter nur den ersten Wert jeder Zeile! Ich brauche aber auch den zweiten! Wie geht denn das dann? DANKE! |
Re: Split-Funktion in Delpi???
Delphi-Quellcode:
function splitOutIndex(Source: String; Delimiter: String; Index: Integer): String;
var count, number: Integer; giveback: String; begin count := 1; number := 0; giveback := ''; while (count <= length(Source)) and (number <= index) do begin if copy(Source, count, length(Delimiter)) = Delimiter then begin number := number + 1; count := count + length(Delimiter); end else begin if number = Index then giveback := giveback + Source[count]; count := count + 1; end; end; result := giveback; end; |
Re: Split-Funktion in Delpi???
:oops: da habe ich zwei Zeilen Code unterschlagen :mrgreen:
Code:
...:cat:...
function Split(InStr, SplitAt: String): TStringArray;
var I, L: Integer; begin SetLength(Result, 0); if InStr = '' then Exit; I := Pos(SplitAt, InStr); L := Length(SplitAt); while I > 0 do begin SetLength(Result, Succ(Length(Result))); Result[High(Result)] := Copy(InStr, 1, Pred(I)); Delete(InStr, 1, Pred(I + L)); I := Pos(SplitAt, InStr); end; [color=#ff0009] SetLength(Result, Succ(Length(Result))); Result[High(Result)] := InStr; [/color] end; |
Re: Split-Funktion in Delpi???
Vielen Dank!!!
Es klappt hervorragend! |
Re: Split-Funktion in Delpi???
Warum benutzt eigentlich niemand die Delphi-eigene Routine "ExtractStrings" zum splitten von Strings?
Delphi-Quellcode:
Gruß
procedure TForm1.FormCreate(Sender: TObject);
var s: String; Items: TStringList; begin Items := TStringList.Create; s := 'text1$$text2$$text3'; ExtractStrings(['$'], [], PChar(s), Items); Memo1.Text := Items.Text; Items.Free end; Wormid [edit=Christian Seehase]Delphi-Tag geschlossen Mfg, Christian Seehase[/edit] |
Re: Split-Funktion in Delpi???
Moin Wormid,
Zitat:
Ist zumindest in D5 nicht in der Hilfe zu finden, wenn auch in der Unit classes enthalten. Danke für den Tip. |
Re: Split-Funktion in Delpi???
Also mein Delphi2005 (Personal) kennt die Funktion, auch die Hilfe.
Ist es erlaubt, die Hilfe hier zu zitieren, oder gibt es da rechtliche Probleme? Wenn ja, dann kann ichs ja hierherschreiben. LG, Gerhard |
Re: Split-Funktion in Delpi???
Zitat:
und zu dieser undokumentierten extractStrings-funktion kann ich nur sagen: ich nutze lieber die explode() aus der CodeLibrary, denn die gibt mir einen simplenn array zurück und keine StringList, die ich erstmal Createn muss... aenogym |
Re: Split-Funktion in Delpi???
Naja, Geschmackssache...
Und wenn würde ich das ACV-Prinzip (Strg+A, Strg+C, Strg+V) verwenden und nicht alles abtippen :wink: Aber trotzdem, für die Interessierten, die noch nicht d2k5 besitzen (viele werden es ja nicht sein):
Code:
[size=18][color=#000080][b]ExtractStrings Routine[/b][/color][/size]
Füllt eine Liste mit Teil-Strings, die aus einem String extrahiert werden. [b]Unit[/b] Classes [b]Syntax[/b] [color=#000080][Delphi] function ExtractStrings(Separators: TSysCharSet, WhiteSpace: TSysCharSet, Content: PAnsiChar, Strings: TStrings): Integer;[/color] [b]Beschreibung[/b] Mit ExtractStrings können Sie eine String-Liste mit den Teil-Strings des in Content übergebenen nullterminierten Strings füllen. Separators enthält die Trennzeichen, mit denen die Teil-Strings voneinander getrennt sind. Wagenrücklaufzeichen, Newline-Zeichen und Anführungszeichen (einfach oder doppelt) werden immer als Trennzeichen behandelt. Trennzeichen werden innerhalb eines Strings mit Anführungszeichen bis zum letzten schließenden Anführungszeichen ignoriert. (Beachten Sie, dass Zeichen in Anführungszeichen in einem String mit Anführungszeichen vorkommen können, wenn Anführungszeichen doppelt verwendet werden.) WhiteSpace enthält Zeichen, die bei der Analyse von Content ignoriert werden sollen, wenn sie am Anfang eines Strings vorkommen. Content ist der nullterminierte String, der in Teil-Strings zerlegt werden soll. Strings ist die String-Liste, der alle aus Content extrahierten Teil-Strings hinzugefügt werden. Diese Liste wird von ExtractStrings nicht gelöscht, d.h. alle in ihr enthaltenen Strings bleiben beim Aufruf von ExtractStrings erhalten. ExtractStrings gibt die Anzahl der Strings zurück, die dem Strings-Parameter hinzugefügt wurden. [color=#000080]Hinweis:[/color] ExtractStrings fügt der Liste keine leeren Strings hinzu. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:48 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