Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   String an bestimmtem Zeichen Splitten (https://www.delphipraxis.net/119073-string-bestimmtem-zeichen-splitten.html)

cRayZo 20. Aug 2008 16:46


String an bestimmtem Zeichen Splitten
 
Hi
ich möchte einen String an einer bestimmten Stelle (bestimmtes Symbol) splitten
der string säh in etwa so aus:

Delphi-Quellcode:
 text,split1,split2: string;
text:='Das hier ist=ein Beispieltext^^';

//das "=" ist hier das Trennsymbol
//sodass ich dann am Ende den String wie folgt vorliegen habe:
split1='Das hier ist'
split2='ein Beispieltext^^'
Das Sring muss nur in 2 teile gesplittet werden.
könnt ihr mir helfen?

Ich dachte an Trennzeichen suchen und dann mit copy, aber ich bin mir nicht sicher

DeddyH 20. Aug 2008 16:49

Re: String an bestimmtem Zeichen Splitten
 
Ganz recht, mit Pos() und Copy() kannst Du das machen.

LuCSteR 20. Aug 2008 16:51

Re: String an bestimmtem Zeichen Splitten
 
Da bist du schon auf dem richtigen Wege :)

Guck dir das hier mal an und du wirst noch einiges mehr können, als einen String zu splitten ;)

http://www.delphi-treff.de/tutorials...gverarbeitung/

grüße

hathor 20. Aug 2008 16:55

Re: String an bestimmtem Zeichen Splitten
 
Delphi-Quellcode:
function SplitStr(const S: string; Delim: Char; out S1, S2: string): Boolean;
  {Splits the string S at the first occurence of delimiter character Delim and
  sets S1 to the sub-string before Delim and S2 to substring following Delim.
  If Delim is found in string True is returned, while if Delim is not in string
  False is returned, S1 is set to S and S2 is set to ''.}
var
  DelimPos: Integer; // position of delimiter in source string
begin
  // Find position of first occurence of delimter in string
  DelimPos := SysUtils.AnsiPos(Delim, S);
  if DelimPos > 0 then
  begin
    // Delimiter found: do split and return True
    S1 := Copy(S, 1, DelimPos - 1);
    S2 := Copy(S, DelimPos + 1, MaxInt);
    Result := True;
  end
  else
  begin
    // Delimeter not found: return false and set S1 to whole string
    S1 := S;
    S2 := '';
    Result := False;
  end;
end;

LuCSteR 20. Aug 2008 17:06

Re: String an bestimmtem Zeichen Splitten
 
Warum werden eigentlich immer gleich die Lösungscodes gepostet. Da lernt man als Themenersteller doch garnichts dabei...

cRayZo 20. Aug 2008 17:08

Re: String an bestimmtem Zeichen Splitten
 
Vielen Dank erstmal ;)
@ LuCSteR: Doch ich lerne, weil ich versuche es zu verstehen.. btw:

bei Hathor ist der Delim ein Char, was bedeutet das, ich wusste es mal...
irgendwas mit einem zeichen aber wie genau?..:oops:

FAlter 20. Aug 2008 17:13

Re: String an bestimmtem Zeichen Splitten
 
Hi,

Delim von Delimiter --> das Trennzeichen.

Mfg
FAlter

DeddyH 20. Aug 2008 17:13

Re: String an bestimmtem Zeichen Splitten
 
Richtig, ein Char ist ein einzelnes Zeichen, im Gegensatz zu z.B. einem String.

cRayZo 20. Aug 2008 17:17

Re: String an bestimmtem Zeichen Splitten
 
Zitat:

Zitat von DeddyH
Richtig, ein Char ist ein einzelnes Zeichen, im Gegensatz zu z.B. einem String.

okay also ist dementsprechend ein char auch ohne '' zu schreiben?
Delphi-Quellcode:
var x: char;
begin x:=h;
end;
//so?
und btw: wie mache ich in einer showmessage eine neue Zeile? Da gabs irgendso ein Zeichen...
in einem normalen string geht das ja so in etwa:
Delphi-Quellcode:
string:='Zeile1'+
'zeile2';
auch in einer showmessage? (wegen der klammer halt)
ich würde es gerne in eine Prog-Zeile schreiben

DeddyH 20. Aug 2008 17:20

Re: String an bestimmtem Zeichen Splitten
 
Nein, auch ein Char musst Du in Hochkommata setzen. Und für eine neue Zeile setze einfach ein #13#10 dazwischen.

FAlter 20. Aug 2008 17:21

Re: String an bestimmtem Zeichen Splitten
 
Hi,

nein, ein Char (von Character) wird wie ein String mit genau einem Zeichen geschrieben. Der Compiler bestimmt aus dem Kontext, ob es ein String oder ein Char ist. Also 'h' und nicht nur h.

(Es gibt aber auch Sprachen, bei denen unterschieden wird, da ist dann z. B. "h" ein String und 'h' ein Char, aber bei pascalartigen Sptrachen ist es in beiden Fällen 'h'.)

Für eine neue Zeile reicht #13 aus, obwohl unter Windows eigentlich #13#10 korrekt ist.

Delphi-Quellcode:
'Zeile1'#13'Zeile2'
Mfg
FAlter

cRayZo 20. Aug 2008 17:32

Re: String an bestimmtem Zeichen Splitten
 
vielen Dank, ihr seid klasse^^

eine Frage noch..

ich habe ein normales Label und möchte es mit einem String füllen.. geht nicht also nicht mit der Funktion von oben
Delphi-Quellcode:
  RandomZeile: integer;
  Loesung:      string;
{Vorgabe}
SplitStr(const S: string; Delim: Char; out S1, S2: string)
{von mir ausgefüllt}
Splitstr(Richedit1.Lines[RandomZeile],'=',label1.Caption ,Loesung)
..

DeddyH 20. Aug 2008 17:35

Re: String an bestimmtem Zeichen Splitten
 
Nimm noch eine lokale Stringvariable, übergib diese an die Funktion und weise sie anschließend dem Label zu.

cRayZo 20. Aug 2008 17:37

Re: String an bestimmtem Zeichen Splitten
 
k dachte es geht auch so..

LuCSteR 20. Aug 2008 17:37

Re: String an bestimmtem Zeichen Splitten
 
An deiner Stelle würde ich mir trotzdem das Tutorial mal anschauen. Dann kannst du mit Strings alles machen was du willst, wenn du alles durchgegangen bist. Bei dem Lösungscodepost z.b. weist du wieder nicht was ein Delimiter ist oder was die einzelnen Paramter bedeuten. klar man kanns bei dem einfachen bsp deuten aber bei anderen fuktionen ist es schon schwieriger zu wissen, wofür ein einzelner paramter steht...

Naja hauptsache du hast jetzt deine Lösung und sie auch verstanden ;)

FAlter 20. Aug 2008 17:42

Re: String an bestimmtem Zeichen Splitten
 
Hi,

Zitat:

Zitat von cRayZo
Delphi-Quellcode:
  RandomZeile: integer;
  Loesung:      string;
{Vorgabe}
SplitStr(const S: string; Delim: Char; out S1, S2: string)
{von mir ausgefüllt}
Splitstr(Richedit1.Lines[RandomZeile],'=',label1.Caption ,Loesung)
..

Delphi-Quellcode:
var
  RandomZeile: integer;
  Loesungm Key: string;

Key := RichEdit1.Lines.Names[RandomZeile];
Label1.Caption := Key;
Loesung := RichEdit1.Lines.Values[Key];
Da es gerade in nem anderen Thread darum geht... Ist bei Delphi und Lazarus (bzw. VCL und LCL) gleich.

Mfg
FAlter

cRayZo 20. Aug 2008 17:55

Re: String an bestimmtem Zeichen Splitten
 
Ja habe ich..^^
nur die Funktion klappt trotzdem nicht

und da wären wir wieder bei deinem Punkt, denn wenn ich sie selber gemacht hätte, wüsste ich woran es liegt:


edit:
vergesst es..^^
muss mich korrigieren... ich hatte einen schleifenfehler davor, die zeilen oben hat er einfach übersprungen, der code stimmt... SRY^^

DP-Maintenance 21. Aug 2008 18:08

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Delphi-Frage

Alter Mann 21. Aug 2008 18:30

Re: String an bestimmtem Zeichen Splitten
 
Hi,

auch wenn es nicht an den bisherigen Code anschließt, darf es so etwas sein?
Delphi-Quellcode:
function StringSplit(input : String; SeperatorChar : Char) : TStringList;
var
  SL : TStringList;
  S1, S2 : String;
begin
  SL := TStringList.Create;
  s1 := input;
  while POS(SeperatorChar, S1) <> 0 do
  begin
    S2 := Copy(S1, 1, POS(SeperatorChar, S1) -1);
    SL.Add(S2);
    S1 := Copy(S1, POS(SeperatorChar, S1) +1, Length(S1));
  end;
  SL.Add(S1);
  Result := SL;
end;
Gruß

[Edit]
Ich glaub das war kontraproduktiv :oops:
[/Edit]

FAlter 21. Aug 2008 18:35

Re: String an bestimmtem Zeichen Splitten
 
Zitat:

Zitat von Alter Mann
Delphi-Quellcode:
function StringSplit(input : String; SeperatorChar : Char) : TStringList;
var
  SL : TStringList;
  S1, S2 : String;
begin
  SL := TStringList.Create;
  s1 := input;
  while POS(SeperatorChar, S1) <> 0 do
  begin
    S2 := Copy(S1, 1, POS(SeperatorChar, S1) -1);
    SL.Add(S2);
    S1 := Copy(S1, POS(SeperatorChar, S1) +1, Length(S1));
  end;
  SL.Add(S1);
  Result := SL;
end;

Hi,

und was machst du bei einer Exception?

Delphi-Quellcode:
function ReturnsAnObject: TObject;

begin
  Result := TObject.Create;
  try
    ...
  except
    Result.Free; // <-- WICHTIG!
    raise;
  end;
end;
In deinem Fall wird dann die SL nicht freigegeben (aber natürlich auch nicht zurückgegeben).

Mfg
FAlter

mkinzler 21. Aug 2008 18:36

Re: String an bestimmtem Zeichen Splitten
 
Wenn mit Stringliste, dann direkt

Delphi-Quellcode:
sl.Delimiter := <Trenner>;
sl.StrictDelimiter := True;
sl.DelimitedString := <String>;

Alter Mann 21. Aug 2008 18:49

Re: String an bestimmtem Zeichen Splitten
 
Hi,

verstehe nicht ganz :gruebel:

@FAlter

Was bzw. wie meinst du das?
Übergeben wird ein String und nur der wird aufgeteilt, von Objekten war keine Rede.

@mkinzler

Das kann die TStringList von Hause aus?

Da kann man mal sehen wie oberflächlich man sich mit den Komponenten beschäftigt :oops:

Gruß

mkinzler 21. Aug 2008 18:53

Re: String an bestimmtem Zeichen Splitten
 
Zitat:

Das kann die TStringList von Hause aus?
Ja. Obwohl ältere Versionen die Eigenschaft StrictDelimiter nicht kennen und dann Leerzeichen als zusätzlichen Trenner ansehen

FAlter 21. Aug 2008 18:54

Re: String an bestimmtem Zeichen Splitten
 
Hi,

aber du erstellst doch ein TStringList-Objekt, welches im Falle einer Exception nicht freigegeben wird.
Nehmen wir einmal an, dein String belegt ca. 1 GiB und du willst ihn auf deine StringList aufteilen, welche dann immer mehr Ram belegt und irgendwann sind dann meine 1,5 GiB voll, obwohl der String nicht komplett abgearbeitet ist. Nun belegt die StringList gie ganze Zeir meinen RAM und ich wunder mich, warum das System so langsam ist und so viel Swappen muss und ich ständig Meldungen von wegen "nicht genügens Speicher" bekomme.

Mfg
FAlter

Alter Mann 22. Aug 2008 16:26

Re: String an bestimmtem Zeichen Splitten
 
Hi


@FAlter :idea:

Danke und Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:19 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