Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zusammenhängende Zahlen aus String ermitteln. (https://www.delphipraxis.net/147572-zusammenhaengende-zahlen-aus-string-ermitteln.html)

sega84 11. Feb 2010 16:49


Zusammenhängende Zahlen aus String ermitteln.
 
Hallo zusammen,
momentan bin ich damit beschäftigt einen Abgleich von MT940-Bankdateien mit einer Rechnungstabelle durchzuführen.
In der MT940-Datei gibt es eine lange Textzeile, in denen alle Informationen stehen:
- Absender der Zahlung
- Überweisungsgrund 1 & 2

Da viele Kunden aber noch zusätzliche Informationen mit in den Überweisungsgrund eintragen, kommt es vor, dass ich die Rechnung nicht in der SQL-Datenbank finden kann.

Ein Bespiel-Datensatz aus der MT940-Zahlungsdatei:
MAX MUSTERMANN99999999999991PRODUKT VERSION 123 VERGOLDET 1,5M MAX MUSTERMANN MEINE FIRMA

MAX MUSTERMANN = Uninteressant
99999999999991 = RechnungsNr
PRODUKT VERSION 123 VERGOLDET 1,5M = Zusätlicher Text des Kunden
MAX MUSTERMANN MEINE FIRMA = Uninteressant

Wenn ich nun alle Zahlen aus dem String ermitteln möchte, bekomme ich folgendes Ergebnis:
9999999999999112315
allerdings benötige ich nur
99999999999991

Alle weiteren Informationen könnte ich eventuell auch noch benötigen, um diese auch zu überprüfen.

Wie ist es nun möglich, zusammenhängende Zahlen aus einem String in eine Array / StringListe zu Packen, so dass ich folgendes Array als Beispiel bekomme:
(99999999999991; 123; 15)

So könnte ich dann jedes einzelne Element des Arrays sauber abfragen...

Vielleicht hat jemand von euch ja eine nette Funktion oder so...
Vielen Dank für eure Hilfe...

ChrisE 11. Feb 2010 17:02

Re: Zusammenhängende Zahlen aus String ermitteln.
 
Hallo sega84,

ich habe zwar keine fertige Lösung, aber du scheinst ja schon eine Teillösung zu haben.
Zitat:

Zitat von sega84
Wenn ich nun alle Zahlen aus dem String ermitteln möchte, bekomme ich folgendes Ergebnis:
9999999999999112315

Nun hilft dir über die letzte Hürde vielleicht selber, in dem du dich fragst wie ein Mensch den erkennt, dass es eine zusammenhängende Zahl ist.
Der erste Schritt wäre, das eine zusammenhängende Zahl dann aufhört, wenn irgendwann ein Zeichen kommt das keine Zahl ist. Jedes mal wenn das der Fall ist, fügst du die Zahl Array hinzu und beginnst eine neue Zahl sobald du ein Zeichen findest das eine Zahl ist :-)

Wenn du es noch verfeinern willst kannst du als zweiten Schritt noch Punkt oder Komma zulassen, wenn vorher ein Zahl war und nachher auch eine kommt. Noch weiter verfeinern kannst du es wenn du ab diesem Zeitpunkt kein DezimalSeperator mehr zulässt. Und so weiter und so weiter und so weiter ;-)

Ich denke, das sollte Dich zum gewünschten Ziel bringen.

Wie gesagt, keine fertige Lösung aber ein Denkanstoß :-)

Greez, Chris

p80286 11. Feb 2010 17:17

Re: Zusammenhängende Zahlen aus String ermitteln.
 
Hallo Sega84,

ich bezweifle ehrlich gesagt, daß die Daten einfach so hintereinander geklatscht wurden. Ist es nicht vielleicht so, das:
Code:
1) name 1..14
2) Nummer 15..28
3) Produkt 29..48
....
Dann wäre es natürlich einfach die Rechnungsnummer durch ein copy aus dem String heraus zu holen.
Oder wenn alle Sätze die gleiche Länge haben, gleich ein Record mit den richtigen Feldern darüber legen......

Gruß
K-H

Techcrawler 11. Feb 2010 18:38

Re: Zusammenhängende Zahlen aus String ermitteln.
 
Wenn dein Eingabestring immer dieses Format hat, führst du diesen RegEx aus:
Delphi-Quellcode:
/^([a-z ]*)([0-9]*)([a-z ,\.]*)([0-9]*)([a-z ,\.]*)([0-9,]*)([a-z ,\.]*)$/i
Die Informationen, die du brauchst, stehen dann in Klammer 3, 5 und 7 (7 mmusst du dann das , noch entfernen).
Da ich derzeit mit Schwerpunkt PHP arbeite musst du nun nur noch den RegEx unter Delphi ausführen.


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