PLZ aus String in neue Variable speichern



  • Hallo,

    ich habe einen großen Text (.txt) in dem Adressen, Telefonnummer, Namen etc. stehen. Teilweise Zeile für Zeile, teilweise auch durcheinander und in einer Zeile mehrere Sachen.
    Ich lasse mir nun Zeile für Zeile als String ausgeben, so wie ich Lust habe ^^
    Ich brauche nun Substrings. E-Mail-Adressen und Internetadressen konnte ich schon erfolgreich filtern.
    Nun möchte ich aus eine Zeile (einem String), in dem Adresse, Telefonnummer, Faxnummer etc. stehen, die PLZ herausfiltern. Diese unterscheidet sich ja von anderen Nummer dadurch dass sie ja 5 stellig (10000-99999) ist.

    Wie kann ich nun in diesem String s nach einer genau 5stelligen Zahl suchen? Und dies dann Zeile für Zeile neu, also auch überprüfen, ob in der Zeile überhaupt so eine 5stellige Zahl vorhanden ist?

    [code="cpp"]

    Ich hoffe auf nützliche Kommentare^^



  • Der am weitesten verbreitete Ansatz sind Trennzeichen.
    (unter anderm ein Grund warum xml so populär ist)

    Diese Zeichenketten kann man dann in Token zerlegen
    wofür es je nach Anwendungsfall bereits reichlich schlaue Funktionen gibt.
    (Validierung ist da so ein Hauptthema)

    Wie sieht Deine Zeichenkette denn aus ?

    (Pseudocode reicht zb "xxxx,plz,tel" oder "xxxx plz tel" oder "xxxxplztel" oder ..)



  • 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] speichern

    Die [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 😕


Anmelden zum Antworten