![]() |
String zerlegen
Ok, das Thema hatten wir schon und die Funktionen pos und copy usw kenne ich. Das ist auch nicht das Problem, also nicht so direkt. Ich habe folgenden String:
Code:
Und folgenden Record:
BELEMMER025=11A13061960 GESCEICH026=1 UNTEEICH027=1 LIEFMMER029=061960 KUNDMMER032=00014028 KUNDNUNG033=ELODRIVE GmbH KUNDNUNG034=Stellantriebstechnik KUNDNUNG035=Potsdamer Strasse 12 PLZKUNDE036=32423 ORTKUNDE037=Minden MATCUNDE038= BELEATUM039=10.04.2006 AULIEMER042= 61960 @PJL ENTER LANGUAGE = PCL
Delphi-Quellcode:
Wie bekomme ich jetzt möglichst elegant ohne ohne viel rumzukopieren, die Werte aus dem String in die entsprechenden Felder meines Records? Leider gibt es kein eindeutiges Trennzeichen. Und an dem String kann ich nichts ändern, den bekomme ich so geliefert.
TPJLComments = packed record
belemmer025: string; // Belegnummer aurecmer041: string; // irgendwas Rechnung auliemer041: string; // irgendwas Lieferschein aulasmer041: string; // irgendwas Lastschrift gesceich026: string; // Geschäftsbereich unteeich027: string; // Untergeschäftsbereich kundmmer032: string; // Kundennummer kundnung033: string; // Kundenbezeichnung 1 (Firmenname) kundnung035: string; // Kundenbezeichnung 2 (Strasse) plzkunde036: string; // PLZ ortkunde037: string; // Ort matcunde038: string; // MatchCode beleatum039: string; // Belegdatum end; |
Re: String zerlegen
Hallo Luckie!
Kommen immer alle Schlüsselworte vor und wenn ja, sind die auch immer in der selben reihenfolge? Gruß Thomas |
Re: String zerlegen
Das kann ich nicht sagen bzw. davon kann ich nicht unbedingt ausgehen. Ich habe hier 12 Beispiele bei denen das wohl der Fall ist. Aber nehmen wir mal den einfachsten Fall, dass es so wäre.
|
Re: String zerlegen
Hmm, mit einem relativ einfachen regulären Ausdruck (oder ein wenig Handarbeit) wäre es doch möglich, aus dem String einfach Schlüssel-Wert-Paare zu machen, oder? Wenn es nicht auf maximale Performance ankommt, könnte man RTTI verwenden, um dann die Schlüssel den Feldern im Record zuzuordnen, denn wenn ich das richtig sehe, heißen die Felder genau gleich wie die Schlüssel, nur in Kleinbuchstaben.
Gehe ich recht in der Annahme, dass der Record ebenfalls so vorgegeben ist? Edit: Ich sehe gerade, offenbar sind die Felder im String immer gleich lang, weil sie mit Leerzeichen aufgefüllt werden, bzw. die Nummern mit führenden Nullen? |
Re: String zerlegen
Den Record habe ich mir so zusammengestellt. Könntest du das etwas ausführen? Mit einem kleinen Code-Beispiel eventuell? Mit Regulaärenausdrücken habe ich noch nie gearbeitet.
Also das stimmt, die Bezeichner sind immer gleich lang, aber leider die Werte hinter dem Gleichzeichen nicht. |
Re: String zerlegen
Ich würde wie folgt vorgehen:
- Eine Liste der Schlüsselwörter festlegen - Die zwei Schlüsselwörter feststellen, die die niedrigste Position haben. - Der Wert zwischen diesen beiden (nach dem "=") gehört zum ersten Schlüsselwort. - Den String bis zum zweiten Schlüsselwort löschen. - Und ab hier von vorne, bis alle Schlüsselwörter abgearbeitet sind. Man kann natürlich noch optimieren, da ab dem zweiten Durchlauf ja das erste Schlüsselwort schon vorliegt. Ob das eine elegante Lösung ist, musst du selbst entscheiden. Da du bei diesem String aber nicht viel Sicherheit beim Aufbau hast, wirst du ohne Copy, Pos und Delete nicht viel machen können. |
Re: String zerlegen
Also, meine Idee war, einen regulären Ausdruck zu bauen, der alles à la "ABCD012=xxxx " in Schlüssel-Wert-Paare zerlegt. Kann dir im Moment nicht mit Code dienen, höchstens
![]() Wenn du über die interne Datenspeicherung frei verfügen kannst, bietet sich eventuell an, es bereits dabei zu belassen, anstatt den "Umweg" über einen Record zu gehen, denn so kannst du ja auch schon über den Namen auf den Wert zugreifen. Wenn du es aber beim Record belassen willst, könntest du jetzt alle Schlüssel-Wert-Paare durchlaufen, jeweils den Index in Kleinbuchstaben umwandeln und dann mithilfe der RTTI im Record das gleichnamige Feld suchen und den Wert hineinschreiben, oder aber eine Funktion schreiben, die das "hardgecodet" übernimmt (also als Parameter Schlüssel und Wert nimmt und dann per case oder so den Wert in das zum Schlüssel gehörende Feld schreibt). Tut mir leid, kann dir zurzeit nicht mit Code dienen, einerseits zickt mein Delphi rum inklusive der Hilfe, zweitens muss ich bei regulären Ausdrücken jedesmal, wenn ich welche brauch, alles nachlesen :mrgreen: und drittens kenne ich mich mit der Delphi-RTTI überhaupt nicht aus, wobei sie nicht allzu kompliziert zu sein scheint. Wenn du diesen Weg gehen willst und es an den regulären Ausdrücken hapert, kann ich mich auch noch ein wenig damit beschäftigen, aber das kann dann ein paar Stunden dauern, weil ich meine eigene Entwicklung auch etwas voran bringen muss, Deadline rückt näher ;) Edit: Ich weiß auch nicht, ob Delphi ohne .NET eine Bibliothek für reguläre Ausdrücke mitbringt, aber da scheint es im Zweifel recht mächtige zum Download zu geben. |
Re: String zerlegen
Zitat:
Grüße vom marabu PS: einfaches Abzählen reicht schon... |
Re: String zerlegen
Hmm, wenn das so ist, kann man sich vieles ersparen, ja, aber das muss nicht so sein. In meinen Augen ist "Leerzeichen-Anzahl Großbuchstaben-Anzahl Zahlen-Gleichheitszeichen" auch genug "Trennzeichen" für die Datensätze. Nachlesen hilft allerdings, falls du irgendwo eine Dokumentation oder einen Quellcode rumliegen hast zu dem Format :)
|
Re: String zerlegen
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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 by Thomas Breitkreuz