PLZ aus String in neue Variable speichern
-
ich bin leider blutiger Anfänger, also verstehe ich leider nicht alles was du da schreibst...
eine Zeile sieht zum bsp so aus:
Lobdengaustraße 13 69493 Hirschberg Tel.: (0621) 71761393 Fax: (0621) 71761395 E-Mail: dvmd@dvmd.de Internet: http://www.dvmd.de
Nur die E-Mail-Adresse und nur die Internetadresse habe ich mit begin=s.find(..,..) und end=s.find(..,..) und das zusammen als substring gefiltert, weil das eigentlich von der Reihenfolge immer so im Textdokument so da steht.
-
nützlicher Kommentar: vergiss die Sachsen nicht.
-
GetLength()
isdigit()
isalnum()Und falls für Dich später Validierung ein Thema sein sollte Replace()
-
isabeau schrieb:
nützlicher Kommentar: vergiss die Sachsen nicht.
Das ist wohl bezogen das Sachsen PLZ s wie 02733 hat
und die je nach Eingabe auch als 2733 (4 stellig)
daherkommen können.In der Tat ein nützlicher Kommentar
-
Kannst du das bitte näher erläutern?
Ich bin noch nicht auf dem Stand um das auf Anhieb zu verstehen.
Kannst du mir vllt ein Beispiel damit zeigen?
-
Wenn Substring.GetLength = 4 oder 5 ist erstes Kriteritum erfüllt.
Wenn dann isdigit() ("Ist Dezimalzahl") für jedes Zeichen des Substring zutrifft
weisst Du das Dein Substring eine 4 oder 5 stellige Zahl ist.
http://www.cplusplus.com/reference/cctype/isdigit/Ob das nun eine Telefonnummer, Postleitzahl oder ähnliches ist
ist ohne die Herkunft der Daten zu kennen schwierig
vor allem wenn es Datensätze mit variabler Länge sind.
(wenn zb mal die Telefonnummer fehlt o.ä.)Aber ein weiteres Kriteritum hast Du ja schon erwähnt,
die Reihenfolge ist anscheinend vorgegeben.Du würdest also genauso vorgehen wie Du es beschrieben hast,
Substring für Substring, Kriteritum nach Kriteritum.Validierung bedeutet das man Eingaben/Daten auf ihre Gültikeit überprüft.
Das ist nicht nur für Interpretationen wie in Deinem Fall wichtig,
sondern auch in der Vorstufe dazu - Datenerfassung.Wenn man das nicht konsequent durchführt könnte zb Schadcode
in einem Internetformular eingegeben werden
der dann Deine Daten korrupiert, ausspäht oder schlimmeres.
-
ah ok... langsam dämmerts!
aber ich habe ja die PLZ noch nicht als Substring. Wie bekomme ich das denn hin?
-
Da ich mir nicht ganz im klaren darüber bin
wie Du Deine Substrings bisher erzeugt hast,
(leider wird Dein code-tag bei mir nicht angezeigt)
würde ich einfachhaltshaber das Leerzeichen " " als Trennzeichen verwenden.Du benutzt da ja s.find() schon.
-
int pos1;
pos1=s.find("E-Mail: ",0);
if(pos1!=string::npos)
{
int begin=s.find("E-Mail: ",0)+8;
int end=s.find(" Internet:",0);
subEmail=s.substr(begin,end-begin);
...
}So habe ich zum Beispiel nur die E-Mail-Adresse als Substring.
Mit den ersten Zeilen sichere ich mir halt, dass er nur die Zeilen nimmt, wo auch Email drin steht und die anderen quasi überspringt.Für die PLZ kann ich aber nicht wirklich einen Anfang und ein Ende nehmen, weil das ja in jedem Datensatz anders ist. Das geht nur bei Email, Fax usw. ganz schön, weil die in jedem Datensatz die gleiche Form haben. Vor und hinter der PLZ steht ja aber nunmal immer was anderes.
-
Aber ein neuer Datensatz beginnt immer in einer neuen Zeile ?
-
Nein.
Die Struktur der Textdatei ist folgende.
1
a
b
c
d
...
2
a
b
c
d
...
3
...Sie ist mehr oder minder allgemeingültig. Es gibt je doch Ausnahmesituationen.
-
bin jetzt auf die Idee gekommen, reguläre Ausdrücke für die PLZ zu benutzen.
" "[0-9]{5}" "
ist das ein allgemeingültiger Ausdruck, der in meinem Fall die PLZ darstellt und sich mittels Leerzeichen von den anderen abgrenzt?Wie müsste ich das nun benutzen, um aus meinem String s den Substring für die PLZ zu bekommen?
Muss ich den String vorher in ein int umwandeln? Wenn ja, wie?Fragen über Fragen ^^
-
Könnte wirklich kompliziert werden..
Erstmal würde ich die Ganze Datei in Substrings zerlegen
und dann versuchen mit email etc in einzelne Datensätze zu trennen.
(kann halt je nach Vollständigkeit schwierig werden)Im Zweifelsfall eine Rückfrage an den Benutzer ob an der betreffenden Stelle
tatsächlich ein neuer Datensatz beginnt..Innerhalb der Datensätze muss dann viel Logik ins Spiel kommen.
Pseudocode:
Alles was vor [tel] und/oder [internet] und/oder ... in substring [adresse] speichernDie [adresse] dann wiederum logisch auswerten.
Wie man eine 4/5 stellige Zahl erkennt weisst Du ja nun,
demnach kannst Du ermitteln was vor und was hinter der Zahl ist..Fehlen zb die PLZ + Hausnummer hast Du immerhin [Adresse]
wobei Du nicht sicher sein kannst was Strasse und was Ort ist.
Du benutzen die grossen Internetfirmen dann Lookup-Table
also Tabellen in denen sie prüfen ob ein Wort ein Stadtnahme ist..
..ggf benutzen die sowas auch für Strassennahmen in Orten.Nur der vollstdändigkeithalber:
Wenn Du das Alles gewuppt hasst - ggf. mit Unicode auseinandersetzen,
in Deutschland klappt das mit den Zeichen noch recht gut,
sobald aber Arabisch/Russisch/Chinesisch miteinfliessen
kann es sonst zu Problemen führen.
-
Kalif schrieb:
bin jetzt auf die Idee gekommen, reguläre Ausdrücke für die PLZ zu benutzen.
" "[0-9]{5}" "
ist das ein allgemeingültiger Ausdruck, der in meinem Fall die PLZ darstellt und sich mittels Leerzeichen von den anderen abgrenzt?Wie müsste ich das nun benutzen, um aus meinem String s den Substring für die PLZ zu bekommen?
Muss ich den String vorher in ein int umwandeln? Wenn ja, wie?Fragen über Fragen ^^
Jetzt begibst Du Dich auf wirklich kompliziertes Terrain
Bist du mit RegExp vertraut oder ist das Neuland für Dich ?
Die Frage mit int Umwanldung hängt davon ab ob Du Unicode benutzt..
aber das hätte eigentlich schon vorher zu Kollisionen führen müssen.
-
ja, die Adresse hab ich jetzt als Substring (Format: Straße Nr PLZ Ort).
Ich weiß, wie ich eine 4/5 stellige Zahl erkenne???
Meinst du mit dem regulären Ausdruck, den ich da genannt habe?Wie muss ich das im Code denn schreiben?
auch mit s.find(..,..), wie es bei Emai gemacht habe?
kannst du nicht mal bitte die Codezeile(n) dafür aufschreiben?
-
Dafür hatte ich Dir eigentlich die Befehle genannt,
die so auch in der MFC existieren.RegExp gibts nur über Umwege (soweit mir bekannt)
zb Boost aber MS hat da glaubich auch was im Netz zu..Im Prinzip ist die MFC dafür da sowas wie RegExp lesbarer zu machen..
Und mit dem Beispielcode tu ich mich "etwas" schwer
weil mir aus der Beschreibung immer noch nicht ersichtlich ist
wie die Daten tatsächlich vorliegen
-
Das ist ja gerade erstmal nicht so wichtig.
Ich hab ja schon diesen Substring[Adresse]: Lobdengaustraße 13 69493 Hirschberg
Ich will ja erstmal nur die PLZ aus diesem Substring raushaben, egal wie.
-
Vielleicht guckst Du Dir nochmal die Befehle an
die ich dir aufgelistet habe,
wie ich oben schon schrieb gibts auch noch andere Möglichkeiten.
(zb Tokenize)Das Problem ist einfach wenn Du nicht verstehst was Du da machst
kommst Du nach der PLZ ja auch nicht weiter
-
Ich muss danach ja auch nicht weiter. Ich will ja nur die PLZ, alles andere hab ich ja schon.
Kann ich reguläre Ausdrücke oder diese Token auch mit s.find() einsetzen?
-
Da hast du es doch schon fast:
Kalif schrieb:
int begin=s.find("E-Mail: ",0)+8;
int end=s.find(" Internet:",0);
subEmail=s.substr(begin,end-begin);Der zweite Parameter bei find gibt an, ab welcher Stelle er suchen soll.
- Lies eine Zeile ein.
- Dann such nach dem ersten Leerzeichen (int begin=s.find(" ",0); )
- Such nach dem zweiten Leerzeichen (int end=s.find(" ", begin+1); )
- Lies den Substring dazwischen aus (sub=s.substr(begin,end-begin); )
- Überprüfe mit Length(), ob der Substring 5stellig ist.
- Falls ja, dann überprüfe jede der 5 Stellen, ob es eine Zahl ist (mit IsDigit() oder 0<=Zeichen_an_jeder_der_5_Stellen<=9).
- Falls ja, dann ist es schon sehr wahrscheinlich eine Postleitzahl, könnte aber auch eine Telefonnummer sein, dann könntest du z.B. überprüfen, ob zwei Stellen vor diesem Substring eine ) steht (wie bei der Vorwahl) oder sonst noch weitere Kriterien überprüfen, die eine PLZ ausschliessen.
- Mach das für alle Substrings zwischen zwei Leerzeichen für die gesamte Zeile.Geht aber sicherlich auch eleganter!
P.S.:
Alles ungetestet aus dem Kopf, kann Spuren von Fehlern enthalten.