text-Datei einlesen und den Inhalt als Variable nutzen

Hallo Volker,
erst Mal brauchen wir da ein Errorhandling falls Straße und Hausnummer nicht dem Muster entsprechen.
Dann hat mich das \n zur Verzweiflung gebracht weil es ein Sonderzeichen für Zeilenumbruch ist.
Dieses sollte jetzt funktionieren:
Code:
        document.getElementById('inputfile')
            .addEventListener('change', function () {

                let fr = new FileReader();
                fr.onload = function () {
                    text = fr.result;
                    // Text mit dem vCard-Parser auswerten,
                    // dann stehen die Werte im Objekt parsed zur Verfügung:
                    const
                        parsed = vCardParser.parse(fr.result);
                    console.log(parsed);
                    const
                        item = parsed[0],
                        postBox = item.address[0].value.postOfficeBox,
                        streetNr = item.address[0].value.street.replace('\\n', ' '),
                        city = item.address[0].value.city,
                        postalCode = item.address[0].value.postalCode,
                        regex = /^([^\d]+) +(\d+[a-zA-Z]*)$/,
                        matches = streetNr.match(regex);
                    if (matches) {
                        const
                            street = matches[1],
                            nr = matches[2];
                        console.log(`postBox: ${postBox}, streetNr: ${streetNr}, street: ${street}, nr: ${nr}`);
                    } else {
                        console.log(`street and number don't match pattern: ${streetNr}`);
                    }
                    // Beispiel: Angezeigten Namen in Eingabefeld eintragen:
                    document.getElementById('display-name').value = parsed[0].displayName;
                }
                fr.readAsText(this.files[0]);
            });
 
Moin Ulrich,

Dann hat mich das \n zur Verzweiflung gebracht weil es ein Sonderzeichen für Zeilenumbruch ist.
Dieses sollte jetzt funktionieren:
Ohje, das tut mir leid.
Ich bin kurz davor, das Thema zu lassen, weil es wirklich schwierig ist, und die vcf so viele Unterschiede zeigen.

Ich hab das jetzt mal so eingebaut:
Code:
document.getElementById('inputfile')
            .addEventListener('change', function () {

                let fr = new FileReader();
                fr.onload = function () {
                text = fr.result;
                    // Text mit dem vCard-Parser auswerten,
                    // dann stehen die Werte im Objekt parsed zur Verfügung:
                    const parsed = vCardParser.parse(fr.result);
                    console.log(parsed);
                    const
                        item = parsed[0],
                        postBox = item.address[0].value.postOfficeBox,
                        streetNr = item.address[0].value.street.replace('\\n', ' '),
                        city = item.address[0].value.city,
                        postalCode = item.address[0].value.postalCode,
                        regex = /^([^\d]+) +(\d+[a-zA-Z]*)$/,
                        matches = streetNr.match(regex);
                    if (matches) {
                        const
                            street = matches[1],
                            nr = matches[2];
                        console.log(`postBox: ${postBox}, streetNr: ${streetNr}, street: ${street}, nr: ${nr}`);
                    } else {
                        console.log(`street and number don't match pattern: ${streetNr}`);
                    }
                    // Beispiel: Angezeigten Namen in Eingabefeld eintragen:
                    // document.getElementById('display-name').value = parsed[0].displayName;
                    document.getElementById('email').value = parsed[0].email[0].value;
                    document.getElementById('firstname').value = parsed[0].name.name;
                    document.getElementById('lastname').value = parsed[0].name.surname;
                    document.getElementById('tel').value = parsed[0].telephone[0].value;
                    document.getElementById('homepage').value = parsed[0].url;
                    document.getElementById('fax').value = parsed[0].telephone[1].value;
                    document.getElementById('handy').value = parsed[0].telephone[2].value;
                    document.getElementById('firma').value = parsed[0].organization;
                }
                fr.readAsText(this.files[0]);
            });

Wie genau bekomme ich jetzt die Variablen [street] und [street_no] zur Weiterverarbeitung zu fassen? Mit
Code:
('street').value = matches[1];
sehe ich nichts.
 
Auf keinen Fall aufgeben, nachdem wir schon so viel hinein gesteckt haben.

Bei diesem Code:
Code:
                    if (matches) {
                        const
                            street = matches[1],
                            nr = matches[2];
                        console.log(`postBox: ${postBox}, streetNr: ${streetNr}, street: ${street}, nr: ${nr}`);
                    } else {
                        console.log(`street and number don't match pattern: ${streetNr}`);
                    }
habe ich etwas nicht bedacht: Die beiden Konstanten werden innerhalb des if-Zweiges definiert und sind außerhalb nicht sichtbar. Ändere das so:
Code:
                    let
                        street = '???',
                        nr = '????';
                    if (matches) {
                            street = matches[1],
                            nr = matches[2];
                        console.log(`postBox: ${postBox}, streetNr: ${streetNr}, street: ${street}, nr: ${nr}`);
                    } else {
                        console.log(`street and number don't match pattern: ${streetNr}`);
                    }
                    // Jetzt sollten street und nr hier verfügbar sein.
Statt der Fragezeichen kannst Du natürlich etwas anderes verwenden für den Fehlerfall.
 
Ich schau mir das nachher genauer an, bin aber heute viel unterwegs.
Wie bekomme ich Plz und Ort abgefangen?

Code:
document.getElementById('plz').value = parsed[0].adress[0].value[0].postalCode;
document.getElementById('ort').value = parsed[0].adress[0].value[0].City;

Da kommt nichts ??? Hab ich schon wieder Formfehler?
 
Das geht aus meinem Code in Posting #33 hervor:
Code:
                    const
                        item = parsed[0],
                        postBox = item.address[0].value.postOfficeBox,
                        streetNr = item.address[0].value.street.replace('\\n', ' '),
                        city = item.address[0].value.city,
                        postalCode = item.address[0].value.postalCode,
postalCode ist die PLZ.
 
Hallo,

so, ich hab's nu.
Das hatte ich nicht gesehen, sorry.

Also:
Es funktioniert in vielen Fällen, in vielen Fällen aber auch nicht.
Interessanter Weise funktioniert es u.A. dann nicht, wenn [street] und [number] an der richtigen
vordefinierten, richtigen Stelle in der vcf stehen :-D.
Und, wenn Einträge fehlen, wird ein "undefined" in die Felder geschrieben.
Aber ok, damit kann ich leben.

Ich will das auch wirklich nicht über strapazieren.

Das Thema an sich ist komplex. In meinen Kontakten auf dem Mac sind ca. 300 Einträge vorhanden.
Teilweise sind diese schon vor vielen Jahren angelegt, vielleicht gab es da noch vCard 1.0, keine Ahnung.
Das Ganze ist also gewachsen, und hat über die Jahre offenbar Einträge gesammelt, die im Mac zwar
richtig dargestellt werden, in der exportierten vCard aber in unterschiedlichen Formen gespeichert werden.
Ich müsste also vielleicht meine Kontakte einmal alle durch arbeiten, vielleicht ergibt sich dann ein besseres Format, aber die ganzen Eventualitäten in PHP abzufangen, dürfte den Rahmen sprengen. Je mehr man über das Lesen und Schreiben von Kontakten und Adressen liesst, desto mehr begreift man, welches Ausmaß das annehmen kann. Gruselig!

Danke also mal wieder für Deine Hilfe und Geduld.

Gruß,

Volker
 
Dann müsste man noch Mal die komplette Datei mit einer Schleife durchgehen um alle Varianten zu berücksichtigen. Aber wenn Du meinst, dass es den Rahmen sprengt, lassen wir es.
 
Zurück