<?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=file( INFILE ) or die ('Fatal: ' . INFILE . ' nicht lesbar.');
$vw_extended_array = array();
$vw_simple_array   = array();
$VwMax = 0;

if ( 
OUTFILE_CSV ) {
    
ftx_file_truncate( OUTFILE_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('/ +/', $vw, 2);
        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) && 6 == $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]][$arVw[3]][$arVw[4]][$arVw[5]]['txt'] = $bezirk;
        }

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

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

        if ( 
3 == $arVwcount ) {
            
$vw_extended_array[$arVw[0]][$arVw[1]][$arVw[2]]['txt'] = $bezirk;
        }
        if ( 
2 == $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_NL, FILE_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_JSON, json_encode ($vw_extended_array), LOCK_EX);
}

if ( 
OUTFILE_SIMPLE_JSON ) {
    
ftx_file_truncate(OUTFILE_SIMPLE_JSON);
    
file_put_contents(OUTFILE_SIMPLE_JSON, json_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($v, true));
        
$r=array();
        foreach (
$a as $z) {
            
$suche = array('y (', ' =>', '=> ');
            
$repl  = array('y(' , '=>' , '=>');
            
$r[]=trim( str_replace($suche, $repl, $z) );
        }
        return (
implode('', $r));
    } else {
        return 
var_export($v, true);
    }
}

#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";
    }
}