AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi String.Split Methode Delimiter mehrmals vorhanden
Thema durchsuchen
Ansicht
Themen-Optionen

String.Split Methode Delimiter mehrmals vorhanden

Ein Thema von SyntaxXx · begonnen am 19. Aug 2014 · letzter Beitrag vom 21. Aug 2014
Antwort Antwort
Seite 1 von 3  1 23      
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

String.Split Methode Delimiter mehrmals vorhanden

  Alt 19. Aug 2014, 19:34
Guten Tag zusammen,
ich habe ein Problem mit der Split Methode bei Strings.

Wenn ich einen String in 2 Teile splitten möchte, der Delimiter aber mehrmals vorhanden ist, kann ich de String nicht richtig Splitten.
Hier ein Beispiel:

Delphi-Quellcode:
meinString := 'Hallo,ich,bin,ein,String';
teil1 := meinString.Split([','])[0];
teil2 := meinString.Split([','])[1];

// teil1: Hallo
// teil2: ich
Ich möchte aber, das nur der erste Delimiter beachtet wird.
Die Ausgabe sollte also so aussehen:
Delphi-Quellcode:
// teil1: Hallo
// teil2: ich,bin,ein,String
Wichtig dabei ist, dass die anderen Delimiter (also das Zeichen) bleiben, ich kann diese also nicht einfach dur ein Leerzeichen oder was anderes ersetzten.

Gibt es eine gute Möglichkeit das zu bewerkstelligen, ohne mit einer Schleife die Anzahl der Delimiter zu zählen und diese dann zu einem String zu verketten?

Am liebsten wäre es mir, wenn "meinString.Split([','])[1];" mir "ich,bin,ein,String" liefert.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.443 Beiträge
 
Delphi 12 Athens
 
#2

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 19. Aug 2014, 19:50
Am liebsten wäre es mir, wenn "meinString.Split([','])[1];" mir "ich,bin,ein,String" liefert.
Dann ist Split nicht die richtige Methode!
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.195 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 19. Aug 2014, 19:51
such mit Pos() die erste Position des Trenners und hol dir mit Copy() die beiden Strings
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.035 Beiträge
 
Delphi 12 Athens
 
#4

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 19. Aug 2014, 20:26
Jupp, Pos und dann mit Copy den gewünschten Teil rauskopieren, wäre besser.
Split macht nunmal das, wofür es gemacht wurde. -> an allen Delimitern aufteilen.
Ansonsten bräuchte man kein dynamisches Array, als Result, sondern nur 2 Strings.

Oder erstmal mit einem StringReplace das erste Komma durch ein neues/anderes Zeichen ersetzen, welches man dann als Delimiter verwendet.

such mit Pos() die erste Position des Trenners und hol dir mit Copy() die beiden Strings
Ich würde es nur etwas anders ausdrücken, also "such mit Pos() die Position des ersten Trenners ...", aber kommt praktisch auf's Gleiche raus.



PS: Delphi-Referenz durchsuchenGetShortHint und Delphi-Referenz durchsuchenGetLongHint machen fast sowas, wie du es suchst, allergdings mit einem "|" (Pipe) als Delimiter.
Es gibt nur einen Unterschied beim Verhalten, wenn kein Delimiter vorhanden ist.

Und wenn es mehrere solcher Strings gibt, dann könnte man eventuell auch das Names&Values des TStrings benutzen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (19. Aug 2014 um 20:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.443 Beiträge
 
Delphi 12 Athens
 
#5

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 19. Aug 2014, 22:33
Also bei XE6 gibt es ein Overload für Split, dem man einen Count mitgeben kann:

meinString.Split([','], 1)[1];

Wenn XE4 das nicht hat, dann muss ich mich also korrigieren: es ist nicht die falsche Methode, sondern eine zu alte Delphi-Version.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 20. Aug 2014, 00:11
Also bei XE6 gibt es ein Overload für Split, dem man einen Count mitgeben kann:

meinString.Split([','], 1)[1]; Wenn XE4 das nicht hat, dann muss ich mich also korrigieren: es ist nicht die falsche Methode, sondern eine zu alte Delphi-Version.
Nein, es ist und bleibt die falsche Methode ... egal wie alt die Delphi-Version ist, denn ohne die Angabe des Parameters, wird die falsche Methode benutzt.

Wenn es in älteren Delphi-Versionen diese Überladung nicht gibt, dann wird die falsche Methode doch nicht richtiger, sondern bleibt genauso falsch, es fehlt nur die Alternative mit der richtigen Methode
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 20. Aug 2014, 08:11
Bei Ausgrabungen habe ich das hier gefunden. Ich habe mir so eine Funktion für meine ersten Gehversuche mit 15 Jahren unter Rocky Mountain Basic (HP9845) geschrieben. Es macht genau das, was u.A. himitsu vorgeschlagen hat.
Delphi-Quellcode:
Function Split(Var S: String; Del: String): String;
Var
  p: Integer;

Begin
  p := pos(Del, S);
  If p = 0 Then Begin
    Result := s;
    s := '';
  End
  Else Begin
    Result := Copy(s, 1, p - 1);
    s := Copy(s, p + length(Del), length(s));
  End;
End;
Damit kann man -allerdings ziemlich unperformant- einen String sukzessive in seine Bestandteile zerlegen:
Delphi-Quellcode:
var
  s : String;

begin
  s:='Das,ist,ein,Satz,mit,Komma';
  while s<>'do writeln(Split(s,','));
End;
Nach dem ersten Aufruf stände in 'S' allerdings das vom TE gewünschte Ergebnis.

Und: Ja, ich werde mich mit Emba mal über den Methodennamen 'Split' ernsthaft unterhalten müssen. Ich war zuerst da, von wegen prior Art und so
  Mit Zitat antworten Zitat
Mikkey

Registriert seit: 5. Aug 2013
265 Beiträge
 
#8

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 20. Aug 2014, 08:21
Ersetze das erste Vorkommen des Kommas durch etwas Anderes (z.B. ein Tabzeichen), darauf dann den Split aufrufen (mit dem Tabzeichen als Delimiter) und voila...
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 20. Aug 2014, 08:23
Beim ersten Review bekämst Du so eine Lösung zurück Lustige Idee, aber da es einfacher geht...
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: String.Split Methode Delimiter mehrmals vorhanden

  Alt 20. Aug 2014, 09:00
Ersetze das erste Vorkommen des Kommas durch etwas Anderes (z.B. ein Tabzeichen), darauf dann den Split aufrufen (mit dem Tabzeichen als Delimiter) und voila...
voila ... kommt in dem ersten Teil auch schon ein TAB vor
Code:
Ic<TAB>h<TAB>bin,ein,String
und dann?
Nun man könnte ja eine Liste von Trennzeichen definieren, prüfen ob diese in dem String vorkommen und dann das passende benutzen.
Und wenn alle Trennzeichen in dem String vorkommen, dann gibt man einfach ein Meldung aus "Ich kann den String nicht an dem ersten Komma trennen!".

Oder man sucht einfach nach dem ersten Vorkommen des Trennzeichens (Komma) und trennt an der Stelle den String einfach auf.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 15:49 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