<?php

/*

Dieses Skript dient dazu, das von der Bundesnetzagentur veröffentlichte "Vorwahlenverzeichnis"
in eine vernünftige, maschinell auswertbare Form zu transferieren.


Rezept:
=======

1. Abholen der Datei:

wget -O ListeOrtsnetzenumerisch.pdf "http://www.bundesnetzagentur.de/SharedDocs/Downloads/DE/Sachgebiete/Telekommunikation/Unternehmen_Institutionen/Nummerierung/Rufnummern/ONVerzeichnisse/ONBVerzeichnis/B-ListeOrtsnetzenumerisch.pdf?__blob=publicationFile&v=3"

2.
pdftotext -raw B-ListeOrtsnetzenumerisch.pdf
(Erzeugt Datei B-ListeOrtsnetzenumerisch.txt)
*/

####### Konfiguration ########

define 'INFILE',       '/tmp/B-ListeOrtsnetzenumerisch.txt' );

define 'OUTFILE_CSV',  '/tmp/vorwahlen.csv' ); # or
#define ( 'OUTFILE_CSV', FALSE);

define 'OUTFILE_SIMPLE_JSON''/tmp/vorwahlen.simple.json' ); # or
#define ( 'OUTFILE_EXTENDED_JSON', FALSE);
define 'OUTFILE_SIMPLE_PHP''/tmp/vorwahlen.simple.inc.php' );   # or
#define ( 'OUTFILE_EXTENDED_PHP', FALSE);

define 'OUTFILE_EXTENDED_JSON''/tmp/vorwahlen.extended.json' ); # or
#define ( 'OUTFILE_EXTENDED_JSON', FALSE);
define 'OUTFILE_EXTENDED_PHP''/tmp/vorwahlen.extended.inc.php' );   # or
#define ( 'OUTFILE_EXTENDED_PHP', FALSE);

define 'FILTER_TRAILING_ZERO'TRUE );  # Führende Null entfernen?

define 'ARRAY_VARNAME''$ar_vw_parts_ort' ); # Variablenname des Arrays für Include
#(Testfunktion unten ggf. anpassen!)

define 'PACK_VAR_EXPORT'TRUE ); # OUTFILE_EXTENDED_PHP ohne Spaces?

define'CSV_TR','|' ) ;  #Trennzeichen in CSV
define'CSV_NL',"\n" );  #Newline in CSV

define ('SHOW_WORK'TRUE ); # Ausgabe der CSV-Daten auf aktueller Konsole?

####### Programm ########

$arRaw=fileINFILE ) or die ('Fatal: ' INFILE ' nicht lesbar.');
$vw_extended_array = array();
$vw_simple_array   = array();
$VwMax 0;

if ( 
OUTFILE_CSV ) {
    
ftx_file_truncateOUTFILE_CSV );
}


while ( 
$row array_shift($arRaw) )  {
    
$trow trim($row);
    
#echo $row, "\n";
    
$vw false;
    
$bezirk false;
    if ( 
preg_match('/^0\d{2,4}/'$row) ) {
        
#Dieses Zeile ist eine Vorwahl
        
$vw     trim($row);

        if ( 
FILTER_TRAILING_ZERO ) {
            
$vw preg_replace('/^0/',''$vw);
        }

        
$parts=false;
        
$parts=preg_split('/ +/'$vw2);
        if ( isset(
$parts[1]) ) {
            
$vw trim($parts[0]);
            
$bezirk trim(str_replace('*1'''$parts[1]));
        } else {
            
$bezirk array_shift($arRaw);
            
$bezirk trim($bezirk);
        }
        
$vw_simple_array["$vw"] = $bezirk;
        
$arVw str_split($vw,1);

        
$arVwcount count($arVw);

        if (
$arVwcount $VwMax) { $VwMax $arVwcount; }

        if ( 
defined('SHOW_WORK') && SHOW_WORK ) {
            echo 
$vw' | '$arVwcount' | '$bezirk "\n";
        }

        if ( 
defined ('FILTER_TRAILING_ZERO') && FILTER_TRAILING_ZERO ) {
            
#$arVwcount = --;
        
}

        if ( (! 
FILTER_TRAILING_ZERO) && == $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]][$arVw[3]][$arVw[4]][$arVw[5]]['txt'] = $bezirk;
        }

        if ( 
== $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]][$arVw[3]][$arVw[4]]['txt'] = $bezirk;
        }

        if ( 
== $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]][$arVw[3]]['txt'] = $bezirk;
        }

        if ( 
== $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]]['txt'] = $bezirk;
        }
        if ( 
== $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]]['txt'] = $bezirk;
        }

        if ( 
defined ('FILTER_TRAILING_ZERO') && FILTER_TRAILING_ZERO && OUTFILE_CSV ) {
            
file_put_contents(OUTFILE_CSV$vw CSV_TR $bezirk CSV_NLFILE_APPEND|LOCK_EX);
        }
    }
}

        if ( 
defined('SHOW_WORK') && SHOW_WORK ) {
            echo 
"Längste Vorwahl hat $VwMax Stellen.\n";
        }


if ( 
OUTFILE_EXTENDED_JSON ) {
    
ftx_file_truncate(OUTFILE_EXTENDED_JSON);
    
file_put_contents(OUTFILE_EXTENDED_JSONjson_encode ($vw_extended_array), LOCK_EX);
}

if ( 
OUTFILE_SIMPLE_JSON ) {
    
ftx_file_truncate(OUTFILE_SIMPLE_JSON);
    
file_put_contents(OUTFILE_SIMPLE_JSONjson_encode ($vw_simple_array), LOCK_EX);
}

if ( 
OUTFILE_EXTENDED_PHP ) {
    
ftx_file_truncate(OUTFILE_EXTENDED_PHP);
    
file_put_contents(OUTFILE_EXTENDED_PHP"<?php\n" ARRAY_VARNAME '=' ftx_var_export($vw_extended_array) . ';'LOCK_EX);
}

if ( 
OUTFILE_SIMPLE_PHP ) {
    
ftx_file_truncate(OUTFILE_SIMPLE_PHP);
    
file_put_contents(OUTFILE_SIMPLE_PHP"<?php\n" ARRAY_VARNAME '=' ftx_var_export($vw_simple_array) . ';'LOCK_EX);
}


function 
ftx_file_truncate($f) {
     
$fh=fopen$f'w') or die ("Die Datei '$f' kann nicht geschrieben werden.");
     
fclose($fh);
}


function 
ftx_var_export($v) {
    if ( 
defined('PACK_VAR_EXPORT') && PACK_VAR_EXPORT ) {
        
$a=explode("\n"var_export($vtrue));
        
$r=array();
        foreach (
$a as $z) {
            
$suche = array('y ('' =>''=> ');
            
$repl  = array('y(' '=>' '=>');
            
$r[]=trimstr_replace($suche$repl$z) );
        }
        return (
implode(''$r));
    } else {
        return 
var_export($vtrue);
    }
}

#test:

if ( defined('SHOW_WORK') && SHOW_WORK ) {
    include( 
OUTFILE_EXTENDED_PHP );
    if ( 
defined('FILTER_TRAILING_ZERO') && FILTER_TRAILING_ZERO )  {
        echo 
"Erwartet: 'Beenz'  ... Ergebnis: '"$ar_vw_parts_ort[3][9][8][5][6]['txt'], "'\n";
        echo 
"Erwartet: 'Rötz'   ... Ergebnis: '"$ar_vw_parts_ort[9][9][7][6]['txt'], "'\n";
        echo 
"Erwartet: 'Kassel' ... Ergebnis: '"$ar_vw_parts_ort[5][6][1]['txt'], "'\n";
        echo 
"Erwartet: 'Berlin' ... Ergebnis: '"$ar_vw_parts_ort[3][0]['txt'], "'\n";
    } else {
        echo 
"Erwartet: 'Beenz'  ... Ergebnis: '"$ar_vw_parts_ort[0][3][9][8][5][6]['txt'], "'\n";
        echo 
"Erwartet: 'Rötz'   ... Ergebnis: '"$ar_vw_parts_ort[0][9][9][7][6]['txt'], "'\n";
        echo 
"Erwartet: 'Kassel' ... Ergebnis: '"$ar_vw_parts_ort[0][5][6][1]['txt'], "'\n";
        echo 
"Erwartet: 'Berlin' ... Ergebnis: '"$ar_vw_parts_ort[0][3][0]['txt'], "'\n";
    }
}