Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Split-Funktion in Delpi??? (https://www.delphipraxis.net/5332-split-funktion-delpi.html)

torud 2. Jun 2003 09:18


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

sakura 2. Jun 2003 09:33

Die Funktion musst Du Dir von Hand schreiben, ist aber nicht schwer. Nicht getestet, sollte aber funktionieren.
Delphi-Quellcode:
// 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;
...:cat:...

torud 2. Jun 2003 10:10

Hi Sakura,

vielen Dank erst einmal. Ich werde es umgehend testen und hoffe auf Erfolg.

Tom

Luckie 2. Jun 2003 10:38

Schon die Code-Library gefunden?`

http://www.delphipraxis.net/internal...hlight=explode

Basic-Master 2. Jun 2003 13:09

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;

sakura 2. Jun 2003 13:45

@BasicMaster:
Ein paar Probleme:

Code:
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;
...:cat:...

Christian Seehase 2. Jun 2003 14:16

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.

sakura 2. Jun 2003 16:25

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:...

FreewareFire 24. Sep 2003 23:36

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!

SirThornberry 25. Sep 2003 07:34

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;

sakura 25. Sep 2003 07:52

Re: Split-Funktion in Delpi???
 
:oops: da habe ich zwei Zeilen Code unterschlagen :mrgreen:

Code:
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;
...:cat:...

FreewareFire 25. Sep 2003 08:11

Re: Split-Funktion in Delpi???
 
Vielen Dank!!!

Es klappt hervorragend!

Wormid 26. Sep 2003 17:17

Re: Split-Funktion in Delpi???
 
Warum benutzt eigentlich niemand die Delphi-eigene Routine "ExtractStrings" zum splitten von Strings?

Delphi-Quellcode:
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;
Gruß

Wormid

[edit=Christian Seehase]Delphi-Tag geschlossen Mfg, Christian Seehase[/edit]

Christian Seehase 26. Sep 2003 17:26

Re: Split-Funktion in Delpi???
 
Moin Wormid,

Zitat:

Zitat von Wormid
Warum benutzt eigentlich niemand die Delphi-eigene Routine "ExtractStrings" zum splitten von Strings?

Vielleicht weil sie nicht dokumentiert ist...
Ist zumindest in D5 nicht in der Hilfe zu finden, wenn auch in der Unit classes enthalten.
Danke für den Tip.

Delphi-Freak 13. Jul 2005 10:32

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

Aenogym 13. Jul 2005 11:01

Re: Split-Funktion in Delpi???
 
Zitat:

Zitat von Delphi-Freak
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

die hilfe zu zitieren ist erlaubt (solange du nicht das _gesamte_ helpbook abtippst :zwinker: )

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

Delphi-Freak 13. Jul 2005 11:13

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 03:06 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