Skip to content

Parser and repair script for dumps of the German phonebook 'Das Telefonbuch'.

Notifications You must be signed in to change notification settings

nitram2342/telefonbuch-parser

Repository files navigation

Der hier vorhandene Satz Skripte parsed die exportierten Telefonbuchdatenbanken
von 'Das Telefonbuch' und importiert die Daten in eine Postgresql-DB. Dabei werden
zahlreiche Probleme automatisiert gefixt.

Siehe auch:

- Erdgeist: "Reverse-Engineering für Ortsfremde", Datenschleuder 77,
  http://ds.ccc.de/pdfs/ds077.pdf
- https://erdgeist.org/cvsweb/Telefonbuch/#dirlist

Wie man eine Telefonbuchdatenbank aufbaut
------------------------------------------


Hinweis: Eine Zeile im Telefonbuch wird meist als
'Zeile' oder 'line' bezeichnet. Eine Continuation
ist ein Satz von Zeilen, die irgendwie semantisch zu
einem Telefonbucheintrag dazugehoeren. Die Continuations
werden in der DB abgebildet.

*
*  Datenbank vorbereiten
*

  > createdb phonebook
  > createuser pbookuser

  > psql phonebook

  ... und dann die folgenden Zeilen SQL-Code pasten

	--
	-- Tabellenlayout fuer die gemergten Eintraege
	--

	drop table tb_eintrag;
	create table tb_eintrag (
	        id serial not null, -- ID des Eintrags

		cont_id integer,   -- ID der Continuation
		cont_pos smallint, -- Position innerhalb der Continuation

		-- bit 0 - contains URL
		-- bit 1 - unused
		-- bit 2 - Darf Inverse gesucht werden
		-- bit 3 - Juristische Person
	
		inverse_allowed boolean,
		is_corporation boolean,
	
	        nachname varchar,
	        vorname varchar,
	        namenszusatz varchar,
		detail varchar,
	
	        strasse varchar,
	        hausnummer varchar,
		adresszusatz varchar,

	        plz char(5),
	        ort varchar,
		ortszusatz varchar,

		lvw char(2),
	        vorwahl varchar,
	        rufnummer varchar,

		is_phone bool,     -- zwei Flags, um Fax=Fon abbilden zu koennen
		is_fax bool,

		email varchar,
		webadresse varchar,

	        version bigint
	);

	-- Wesentliche Indizes fuer den Aufbau

	create unique index idx_tb_eintrag_id on tb_eintrag(id);
	create index idx_tb_eintrag_cont_id on tb_eintrag(cont_id);
	create index idx_tb_eintrag_completenumber on tb_eintrag(lvw, vorwahl, rufnummer);


	-- Sequence fuer die Continuations
	drop sequence seq_cont_id;
	create sequence seq_cont_id start with 1;


*
* Telefonbuchdaten parsen
*

  Zum Parsen, Reparieren, Importieren, Mergen der Telefonbuchdaten gibt es das
  Skript tb_parser.pl . Der letzte Parameter gibt den Modus an.

  > sh process_all_pbooks.sh fixmelater
  > sh process_all_pbooks.sh repair
  > sh process_all_pbooks.sh import

  Der Modus fixmelater laesst zunaechst das Programm laufen. Anhand der Programmausgaben
  kann man abschaetzen, welche Probleme automatisiert fixbar waeren, wenn man entsprechend
  den Code anpasst. Der Modus 'repair' fragt den Benutzer nach der Eingabe eines manuellen
  Fixes. Dieser wird in einer lokalen Datei gespeichert und steht fuer spaetere Durchlaeufe
  zur Verfuegung. Bis inkl. Fruehjahr 2007 sind Patchsets vorhanden. Die kann ich aus
  naeheliegenden Gruenden natuerlich nicht oeffentlich machen.

  Anzahl der Fixes/Ignores pro Telefonbuch:

  243 .1998_Herbst.patch
  13 .1999_Fruehjahr.patch
  108 .1999_Herbst.patch
  193 .2000_Fruehjahr.patch
  163 .2000_Herbst.patch
  208 .2001_Fruehjahr.patch
  303 .2001_Herbst.patch
  132 .2002_Fruehjahr.patch
  86 .2002_Herbst.patch
  90 .2003_Fruehjahr.patch
  71 .2003_Herbst.patch
  137 .2004_Fruehjahr.patch
  145 .2004_Herbst.patch
  145 .2005_Fruehjahr.patch
  40 .2005_Herbst.patch
  232 .2006_Fruehjahr.patch
  359 .2006_Herbst.patch
  783 .2007_Fruehjahr.patch


  Beispiele fuer Patch-Eintraege:

  13111046;action=ignore;test=cleanup_number

    Bedeutet, dass in Zeile 13111046 der Code fuer die Rufnummernbereinigung scheitert,
    und das Tool beim naechsten Run die Zeile in Bezug auf den Rufnummern-Check ignorieren
    soll.

  30831702;action=fixlater;test=cleanup_number

    Testfall schlug fehl. Das soll bei einem spaeteren Lauf repariert werden.

  14803957;action=replace;test=check_number;rufnummer=568XXXXX

    In der Zeile muss eine Rufnummer ersetzt werden (hier anonymisiert).


*
* Volltextindex erzeugen (fuer Arme-Leute-Datenbanken)
*

  for i in nachname vorname strasse ort ortszusatz namenszusatz adresszusatz detail; do 
	time perl fti_dbi.pl --db phonebook --table tb_eintrag --columns $i; 
  done


*
* Die restlichen Indizes Anlegen
*

  > psql phonebook

	create index idx_tb_eintrag_plz on tb_eintrag(plz);
	create index idx_tb_eintrag_prefix on tb_eintrag(vorwahl);
#	create index idx_tb_eintrag_nummer on tb_eintrag(rufnummer);

About

Parser and repair script for dumps of the German phonebook 'Das Telefonbuch'.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published