Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   posex oder pos, fester trenner im string (https://www.delphipraxis.net/181521-posex-oder-pos-fester-trenner-im-string.html)

motec 21. Aug 2014 18:34

Delphi-Version: 6

posex oder pos, fester trenner im string
 
Hallo zusammen,

ich habe ein Problem und hoffe hier auf die Lösung, mit Delphi hatte ich bisher nichts am Hut, muss aber in einem Projekt eine Lösung für ein Problem finden.

Ich habe einen string indem durch @@ die für mich interessanten Werte stecken, wie komme ich hier dran? Habe schon mit posex rum experementiert, gebe es aber auf.:pale:

Vorgabe: L99522621@@99@@05652s8@@85zzs81@@r-77 1564@@20082014@@22082014@@@@@@

zwischen den doppelten affen liegen die Indizes, diese können unterschiedlich lang oder auch leer sein. Wie komme ich am besten an diese Werte?:?:

Bin für jede Hilfe dankbar.

mfg

himitsu 21. Aug 2014 18:38

AW: posex oder pos, fester trenner im string
 
SplitString und Co.?
z.B. http://www.delphipraxis.net/181489-s...vorhanden.html

Man kann natürlich auch gern RegEx verwenden.

Uwe Raabe 21. Aug 2014 21:05

AW: posex oder pos, fester trenner im string
 
Wirklich Delphi 6?

Jens01 21. Aug 2014 22:58

AW: posex oder pos, fester trenner im string
 
Zitat:

Habe schon mit posex rum experementiert, gebe es aber auf.
"posex" ?
Ein kleiner Perversling der Neue?

himitsu 21. Aug 2014 23:22

AW: posex oder pos, fester trenner im string
 
Jupp, für irgendwas muß diese eine komische Erfindung ja gut sein.

Großschreibung :roll:

pelzig 22. Aug 2014 07:20

AW: posex oder pos, fester trenner im string
 
Delphi-Quellcode:
var
  s: string;
begin
  s := 'L99522621@@99@@05652s8@@85zzs81@@r-77 1564@@20082014@@22082014@@@@@@';
  s := StringReplace(s, '@@', '|', [rfReplaceAll]);
end;
StringReplace ersetzt den doppelten Klammeraffen durch ein bel. Zeichen (hier '|'), was möglichst nicht in s vorkommen sollte. Suche dann in der DP mal nach "delimiter".

MfG

Dejan Vu 22. Aug 2014 07:26

AW: posex oder pos, fester trenner im string
 
Wozu erst ersetzen? Einfach direkt verwenden:
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;

...
var
  s,teilString : string;

begin
  s := 'L99522621@@99@@05652s8@@85zzs81@@r-77 1564@@20082014@@22082014@@@@@@';
  while s<>'' do begin
    teilString := Split(s,'@@');
    TuWasMitDem(teilString);
  end;
end;
Und wenn es schnell gehen soll:
http://www.delphipraxis.net/82268-[optimiert]-explode-prozedur-reloaded-ersatz-fuer-codelib.html

Eine unicodefähige Variante ist weiter hinten zu finden.

Uwe Raabe 22. Aug 2014 07:31

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von Dejan Vu (Beitrag 1269510)
Ich weiß nur nicht, ob das unicodefähig ist, sollte aber kein Problem sein, das anzupassen.

Wenn es wirklich um Delphi 6 geht, sollte sich diese Frage gar nicht stellen.

Bei neueren Delphi-Versionen kann man auch einfach eine TStringList nehmen und mit StrictDelimiter (gibt's auch noch nicht bei D7) und DelimitedText arbeiten.

Dejan Vu 22. Aug 2014 07:33

AW: posex oder pos, fester trenner im string
 
Ist mir auch grad aufgefallen..

pelzig 22. Aug 2014 07:35

AW: posex oder pos, fester trenner im string
 
@Dejan Vu:
Die vielen Klammeraffen am Stringende könnten dem TE beim PoSex vllt. Schwierigkeiten machen, daher der StringReplace-Vorschlag :-D

MfG

Dejan Vu 22. Aug 2014 07:47

AW: posex oder pos, fester trenner im string
 
Dann steht zwischen den Delimitern nichts und die Routine liefern einen leeren String. Mit '|' wäre das genau so.

Sir Rufo 22. Aug 2014 07:51

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von pelzig (Beitrag 1269514)
@Dejan Vu:
Die vielen Klammeraffen am Stringende könnten dem TE beim PoSex vllt. Schwierigkeiten machen, daher der StringReplace-Vorschlag :-D

MfG

So ein blindes
Delphi-Quellcode:
StringReplace
(blind in der Funktion und Anwendung) ist immer der Anfang von Problemen, die einen früher oder später einholen.

Warum schreibt man sich nicht eine Funktion, die das auch wirklich interpretieren kann?

motec 22. Aug 2014 07:53

AW: posex oder pos, fester trenner im string
 
Vielen Dank an ALLE für die Hinweise, SplitString hat mir geholfen.

#Jens01 Perversling ist, wer an perverses denkt. :lol:

Super Forum, hat mir bei einem laufenden Projekt in vielen Fragen geholfen.

himitsu 22. Aug 2014 08:22

AW: posex oder pos, fester trenner im string
 
Bezüglich dem StringReplace-Vorschlag:

Einige Split-Funktionen können nur mit einzelnen Trennzeichen, aber nicht mit Trenn-Sequenzen umgehen,
also nur ein und nicht mehrere Zeichen.

Wenn man soeine Funktion verwendet, dann muß man entweder die "Trennzeichen" ersetzen,
oder man löscht/ignoriert nach dem auftrennen jede zweite Zeile.

Hier darf aber das "Trennzeichen" als "Einzelzeichen" nicht in den Strings vorkommen, denn wenn das so ist, dann muß es wirklich als Trenn-Sequenz behandelt werden.

Sir Rufo 22. Aug 2014 08:31

AW: posex oder pos, fester trenner im string
 
Man muss sich eben entscheiden, ob man Daten so interpretiert, wie die Vereinbarung/das Protokoll das vorsieht oder eben nur quasi so in etwa.

Wundern darf man sich dann aber auch nicht wenn das Ergebins auch so aussieht: Wie vereibart oder quasi so in etwa :)

pelzig 22. Aug 2014 09:09

AW: posex oder pos, fester trenner im string
 
Wenn die Vereinbarung der doppelte Klammeraffe als Trennzeichen war: Warum nicht lokal in ein gängigeres Trennzeichen stringreplacen?

Ich benutze das StringReplace um eingehenden Kram notfalls CSV-kompatibel zu machen, um dann meine CSV-Funktionen (und ggfs. Excel oder LibreOfficeCalc zwecks Kontrolle) darauf loszulassen.

Wie himitsu schon schrub: Bei mir muss das Trennzeichen ein Zeichen, keine Zeichenfolge sein.

Jeder wie er kann oder muss. Manche sind halt "Profis", ich eher nicht. Bisher ist mir noch nichts um die Ohren geflogen, was "quasi so in etwa" war. Habe bisher wohl offensichtlich nur Anfängerglück gehabt :oops:

===========================================
quasi = ungefähr
etwa = ungefähr

quasi so in etwa = ungefähr so in ungefähr
===========================================

Das Problem des TE wurde gelöst, also bitte Ruhe im Karton :-D

MfG

Dejan Vu 22. Aug 2014 09:33

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von himitsu (Beitrag 1269523)
Einige Split-Funktionen können nur mit einzelnen Trennzeichen, aber nicht mit Trenn-Sequenzen umgehen

Dann sind das keine sonderlich guten 'Split' Funktionen. Da schreibe/suche ich mir lieber eine ordentliche Routine, als die Eingabe (meinen String) zu umzuverknurpseln, das die kastrierte Split-Routine damit klar kommt.

Für mich ist die ideale Split-Funktion übrigens die hier.
Aber irgendwie habe ich den Eindruck, das es derzeit im Forum keine richtigen Probleme mehr gibt, sonst würden wir uns hier nicht seitenlang über Split-Routinen unterhalten.

Zitat:

Zitat von pelzig (Beitrag 1269526)
Wenn die Vereinbarung der doppelte Klammeraffe als Trennzeichen war: Warum nicht lokal in ein gängigeres Trennzeichen stringreplacen?

Wenn man das dann mit Excel weiterverarbeiten will, bleibt Dir ja nichts anderes übrig. Aber ich finde in der Frage des TE den Hinweis nicht, das er das mit Excel weiterverarbeiten will. Ergo halte ich deine Idee für umständlich.
Zitat:

Das Problem des TE wurde gelöst, also bitte Ruhe im Karton :-D
Eben. Wozu dann also deine Ausführungen? :-D

Außerdem bin ich nich im Karton. :stupid:

Uwe Raabe 22. Aug 2014 10:01

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von himitsu (Beitrag 1269523)
Einige Split-Funktionen können nur mit einzelnen Trennzeichen, aber nicht mit Trenn-Sequenzen umgehen,
also nur ein und nicht mehrere Zeichen.

Für diesen Fall kann man (in neueren Delphi-Versionen) auch die TStringList verwenden: How to split string by a multi-character delimiter?

himitsu 22. Aug 2014 10:11

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von Dejan Vu (Beitrag 1269529)
Dann sind das keine sonderlich guten 'Split' Funktionen.

Das kommt auf die Definition an.

Es gibt Split-Funktionen, die bekommen 2 Parameter rein.
- den aufzuteilenden String
- und einen String mit allen Trennzeichen
Da wird dann in dem "Trennzeichenstring" jedes Zeichen als eigenständige Trennzeichen verwendet.
Delphi-Quellcode:
Split('a*b c', '* ')
würde dann quasi einem
Delphi-Quellcode:
Split('a*b c', ['*', ' '])
entsprechen.


Und jetzt rate mal, was man im Delphi verbaut hat.
Aber wenn man genau hin sieht, dann fällt einem das "s", am Ende des Delimiters-Parameter auf. :stupid:

pelzig 22. Aug 2014 11:19

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1269534)
Zitat:

Zitat von himitsu (Beitrag 1269523)
Einige Split-Funktionen können nur mit einzelnen Trennzeichen, aber nicht mit Trenn-Sequenzen umgehen,
also nur ein und nicht mehrere Zeichen.

Für diesen Fall kann man (in neueren Delphi-Versionen) auch die TStringList verwenden: How to split string by a multi-character delimiter?

Stammt die Frage nach Delphi 6 nicht von Dir?

Wie würden Deine Antworten denn für D7..XE7 ausfallen?

Warum eigentlich sollte man jede Frage nicht eigentlich immer bis auf die Assemblerbefehle des 8086 mit dem Azwangsigergate hin reANALysiren?

Was mich OT mehr interessieren würde:

Nagelneue/sauteure WP8.1 Smartphones haben eine gewisse Rechenleistung.
Wie lässt sich deren Rechenleistung mit einem herkömmlichen PC vergleichen?

MfG

himitsu 22. Aug 2014 11:46

AW: posex oder pos, fester trenner im string
 
[gelöscht] da geht's weiter http://www.delphipraxis.net/181531-l...-moeglich.html

mkinzler 22. Aug 2014 12:12

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von himitsu (Beitrag 1269553)
Vielleicht vergleichbar mit meinem alten Netbook (wenn es mehr als nur einen Kern hätte).

Kommt drauf an was für ein Handy, wie es getaktet ist, welche CPU es besitzt, wie alt das Handy und der PC sind.

Vor 15-20 Jahren hatten einfache Taschenrechner schon mehr Rechenleistung, als der Boardcomputer von Apollo 11.

Falscher Thread

himitsu 22. Aug 2014 12:20

AW: posex oder pos, fester trenner im string
 
Nö, war schon "richtig" ... siehe vorhergehende Seite :stupid:

Uwe Raabe 22. Aug 2014 12:56

AW: posex oder pos, fester trenner im string
 
Zitat:

Zitat von pelzig (Beitrag 1269547)
Stammt die Frage nach Delphi 6 nicht von Dir?

Wie würden Deine Antworten denn für D7..XE7 ausfallen?

Ich nehme mir einfach die Freiheit (und damit bin ich nicht allein hier) auch Antworten zu posten, die in der Umgebung des TE nicht einsetzbar sind. Es soll durchaus vorkommen, daß jemand mit einer neueren Delphi-Version hier die Suchfunktion nutzt und vielleicht ganz dankbar ist, einen moderneren Ansatz für die Lösung seines Problems zu finden.

Vielleicht bringt es ja auch den Einen oder Anderen dazu sein Delphi zu erneuern. (Die Hoffnung stirbt zuletzt.)

DeddyH 22. Aug 2014 13:04

AW: posex oder pos, fester trenner im string
 
Da gebe ich Uwe uneingeschränkt Recht. Ehrlich gesagt wusste ich auch nicht, dass man (bereits bei XE) den LineBreak einer TStringlist selbst festlegen kann. Ich finde diese Lösung sehr smart und komfortabel und werde sie bei Bedarf sicherlich einsetzen :thumb:

Dejan Vu 22. Aug 2014 13:09

AW: posex oder pos, fester trenner im string
 
Äh. Ich auch. Also 'Uwe recht geben' und nicht wissen, das das neuerdings geht, und verwenden, wenn man es mal braucht und. zusätzlich noch: "Ach nee, sollte mal doch wieder schauen, was es in der VCL schon fertig gibt".

Daniel 22. Aug 2014 16:31

AW: posex oder pos, fester trenner im string
 
Ich habe eine komplette Seite entfernen müssen.
Seid so gut und bleibt beim Thema.
:roll:


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