Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Software>bestimmte Angaben aus PDF-Dokument extrahieren

bestimmte Angaben aus PDF-Dokument extrahieren

x.hayco
x.hayco15.09.1217:29
Aus zwei PDF-Dokumenten möchte ich Kontaktdaten extrahieren. Ziel ist es die Daten ins Adressbuch zu übernehmen. Da es sich um mehrere hundert Kontakte handelt kommt Copy&Paste für jede einzelne Zeile nicht in Frage. Für ein ganzes Dokument brachte Copy&Paste dieselben Ergebnisse wie weiter unten beschrieben.

Die beiden Dokumente sind unterschiedlich aufgebaut. Nachfolgend eine Beschreibung und was ich schon ausprobiert habe.

Dokument A:
Aufbau:
Jede Seite mit vier Spalten, jede Spalte für einen Kontakt. Ein Teil der Inhalte steht immer an derselben Stelle (Name, Vorname / Firma / Straße / Ort); pro Angabe eine Zeile. Jedoch ist die Firma schon mal zweizeilig.
Folgende Angaben sind nicht alle bei jedem Kontakt vorhanden, aber pro Zeile am Anfang mit dem entsprechenden Begriff gekennzeichnet: Telefon / Fax / E-Mail / Internet.
Dann kommen noch jede Menge Angaben zur Person. Diese sind jedoch uninteressant für mich; beziehungsweise gehören dann später nicht ins Adressbuch.

bisheriges Vorgehen:
Alle Angaben habe ich in TextEdit kopiert und als reinen Text (.txt) gespeichert. Als Ergebnis stehen zunächst die ersten beiden Zeilen (durchgängig über die vier Spalten) einer jeden Seite, dann die restlichen Angaben aus den Spalten. Name A / Name B / Name C / Name D. Dann der Inhalt der zweiten Zeile A / B / C / D (benötige ich komplett nicht). Dann die Kontaktdaten und Angaben je Person Person A / Person B / Person C / Person D
Diesen reinen Text habe ich in Numbers kopiert. Dabei erhielt ich zwei Spalten. Der Inhalt der zweiten Spalte ist im Original eine Einrückung im Fließtext und wird nicht benötigt.
Alle anderen Angaben stehen in einer Spalte. Zunächst, wie bei TextEdit, die vier Namen einer Seite in je einer Zeile Name A / Name B / Name C / Name D. Dann der Inhalt der zweiten Zeile A / B / C / D (benötige ich komplett nicht). Die weiteren Angaben sind auf mehrere Zeilen verteilt. Dabei stehen Firma, Straße, Ort, Telefon und - soweit vorhanden - Fax, E-Mail, Internet mal in einer Zelle, mal in zwei Zellen. Trennzeichen sind nicht vorhanden.


Dokument B:
Aufbau in drei Spalten:
1. Spalte: Firma / Vorname Name / Straße / Ort (manchmal fehlt die Firma, manchmal ist die Angabe zweizeilig).
2. Spalte: Telefon / Telefax / Mobil / E-Mail-Adresse / URL . Bei manchen Kontakten ist keine dieser Angaben vorhanden, bei anderen alle, wieder bei anderen dies oder das. Telefon, Telefax und Mobil stehen als Begriffe am Anfang der entsprechenden Zeile. Die E-Mail-Adresse und URL ohne Kennzeichnung.
3. Spalte: Bild der entsprechenden Person (wäre nett, benötige ich aber nicht)
Noch eine Beobachtung: Wenn ich zeilenweise in einer Spalte Text markieren möchte springt die Markierung beim Übergang zum nächsten Eintrag wild über die Seite. Es wird dann Text in der anderen Spalte markiert, dabei aber ganze Einträge übersprungen.

bisheriges Vorgehen:
Wie bei Dokument A als reinen Text (.txt) gespeichert und in Numbers kopiert. Dort erhielt ich zwei Spalten. In der 2. Spalte die Mobil-Nummern ohne den Begriff „Mobil:“. Vermutlich weil der Verfasser bei dieser Angabe die Nummer immer so weit einrückte, bis der Strich (-) zwischen Vorwahl und Rufnummer bei den Angaben Telefon, Telefax, Mobil untereinander standen.
In der ersten Spalte finden sich alle anderen Angaben, jedoch nach Spalten. Also zunächst Firma, Name, Straße, Ort aller Personen einer Seite, dann Telefon, Telefax, Mobil, E-Mail-Adresse, URL aller Personen einer Seite. Dann dasselbe für die nächste Seite. Keine Trennzeichen.
Bei der Verteilung in Zellen kann ich keine Regelmäßigkeit feststellen, außer, dass nicht ein Kontakt pro Zelle aufgelöst ist, sondern es wild durcheinander geht. Mal ist noch etwas von dem nächsten Kontakt in der Zelle, mal nur ein Teil der Angaben eines Kontaktes.



Überlegungen:
Zunächst dachte ich irgendwie die Daten mit importieren und .csv und Numbers relativ sauber als Tabelle zu bekommen. Da nun die Daten in den beiden Dokumenten aber nicht so herausgelesen werden wie sie sich mir optisch im Ausgangsdokument zeigen wird das wohl nichts.
Hier im Forum bin ich auf eine Anleitung vom Terminal-Zauberer _mäuschen gestoßen. So habe ich schon mal die E-Mail-Adressen ausgelesen. Wenn ich dies nun auch für die anderen Angaben machen könnte, hätte ich verschiedene Spalten in Numbers (Firma, Name, etc). Diese zwar nicht passgenau pro Zeile, aber durch Verschieben relativ einfach richtigzustellen.
Dies ist der Zauberspruch:

perl -wne'while(/[\w\.\-]+@[\w\.\-]+\w+/g){print "$&\n"}' ~/Desktop/pdf.txt | sort -u > ~/Desktop/output.txt

Von einem Teil davon ahne ich die Bewandtnis. Das @ lässt wohl das eindeutige Erkennungsmerkmal einer E-Mail-Adresse finden. Entsprechend müssten andere Erkennungszeichen oder Strukturen auch zu finden sein. In meinem jugendlichen Leichtsinn habe ich das @ mal ausgetauscht durch www (mit und ohne Punkt, Anführungszeichen u.a.). Dies führte zu keinem Ergebnis.
Nach meiner Überlegung sind die Einträge zu unterscheiden:
- Telefon, Telefax, Mobil (bei B auch E-Mail und Internet) durch das jeweilige Wort am Anfang der Zeile
- Ort durch die Struktur fünf Zahlen, gefolgt von Buchstaben
- Straße durch die Struktur Buchstaben gefolgt von Zahlen
- URL durch die Zeichenkombination „www.“ (bei B evtl. nicht notwendig, siehe ersten Punkt)
- Name und Firma sind leider uneindeutig, aber die eizigen Angaben die nur Buchstaben enthalten

Welchen Teil ich weglassen muss, damit das Ergebnis nicht alphabetisch geordnet, sondern in der Reihenfolge des Dokuments ausgegeben wird habe ich herausgefunden. Aber wie sage ich meinem Mac, dass er nach den genannten Erkennungszeichen sucht?
„Ich zweifle - also könnte ich sein“
0

Kommentare

oxid
oxid15.09.1218:30
hi, ich weiß nicht ob das funktioniert aber im programm adressbuch gibt es den menüpunkt:
ablage importieren textdatei

vielleicht funkts ja…
0
x.hayco
x.hayco16.09.1209:41
Bei mir schnurrt noch der Schnee-Leopard. Da kennst das Adressbuch nur die Funktion importieren und verlangt eine Datei mit Trennzeichen Komma oder Tab.
Da will ich ja hin. Eine Numbers-Datei, die ich dann als .csv speichern kann.
„Ich zweifle - also könnte ich sein“
0
x.hayco
x.hayco17.09.1215:17
Ein Stückchen bin ich weitergekommen. Vielleicht findet sich doch noch jemand der mir weiterhelfen kann.

Der Zauberspruch ist wohl in Perl. (Wenn man weiß, dass es das gibt, sieht man es auch.)
Da er genau das macht, was ich will, nämlich ein Dokument durchsuchen, bestimmte Zeichenketten finden und diese dann in ein neues Dokument ablegen, ist es wohl geschickt nur den Teil für das Suchen der anderen Zeichenkette einzufügen. Dies habe ich mehrfach versucht, jedoch leider ohne jedes Ergebnis.
Folgende Zeichenketten sollen gefunden werden:

Musterstraße 12345 \w\s\d{1,5} - Die Hausnummer soll von ein- bis fünfstellig gefunden werden.

12345 Musterort \d\d\d\d\d\s\w

www.Muster-URL \www\

Telefon \Telefon\ bzw. Telefax \Telefax\ bzw. Mobil \Mobil\ bzw. Fax \Fax\ bzw. E-Mail \E-Mail\ bzw. Internet \Internet\

Diese Suchanfragen müssen diesen Teil ersetzen, vermute ich: [\w\.\-]+@[\w\.\-]

Hier noch mal der komplette Befehl:
perl -wne'while(/[\w\.\-]+@[\w\.\-]+\w+/g){print "$&\n"}' ~/Desktop/pdf.txt | sort -u > ~/Desktop/output.txt

Mit unterschiedlichen Klammern, Strichen, Punken; an verschiedenen Stellen und unter weglassen verschieden großer Teile habe ich es versucht. Habe ich die richtige Version nur noch nicht ausprobiert, oder befinde ich mich komplett auf dem Holzweg?
„Ich zweifle - also könnte ich sein“
0
_mäuschen
_mäuschen17.09.1217:02
Da Du mehrere, unterschiedlich Daten extrahieren möchtest,
kannst Du oben angeführten Einzeiler nicht verwenden.

Schau mal hier diesen Mehrzeiler als Idee

gl
0
x.hayco
x.hayco17.09.1219:07
Ich möchte die nicht alle Daten in einem Durchgang extrahieren. Für jede Angabe ein Durchgang, damit ich getrennte Listen habe, die ich dann in Numbers kopieren kann. - Dachte ich mir so.
Aber ich probiere den Vorschlag natürlich erst mal aus. Danke schon mal.
„Ich zweifle - also könnte ich sein“
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.