DVB-T Senderdaten aus dem Bestand der Bundesnetzagentur (25-Mai-2009)

Inhaltsverzeichnis

Übersicht
1. Senderdaten der Bundesnetzagentur
2. Format der Textdatei
3. Bearbeitung/Filterung mit dem GNU Tool gawk
4. Tools/Scripts
5. Zusammenfassung/Ausblick

Übersicht

Textdatei der Bundesnetzagentur vom 03-Dez-2007.
Hier der Link zu den Programm Informationen:
DVB-T in Hessen
Link zu den Sender Basisdaten (Antennenhöhe & WGS84 Koordinate) der Bundesnetzagentur funktioniert nicht mehr.

Die Bundesnetzagentur ist in Deutschland für die Vergabe und Verwaltung der Senderfrequenzen zuständig. Sie stellt auf ihrer Homepage Dateien mit den Senderdaten für Analog TV, DVB-T, UKW und DAB zur Verfügung. Alle Datenbank Dateien liegen im ASCII Textformat im gepackten Format (.zip) vor. Die Beschreibung des Textformats kann man auf derselben Seite runterladen, sie liegt im Excel Format vor.
Die Datenbank Dateien beinhalten die Daten der Sender aus Deutschland und dem europäischen Auslands. Weil die Dateien sehr groß sind, müssen sie gegebenenfalls gefiltert werden. Wie dies gemacht werden kann, verrät das nächste Kapitel.

2. Automatischen Bearbeitung der Rohdaten

2.1 Erzeugen einer .csv Datei für MS Excel

Das awk Script txt2csv.awk konvertieren alle Spalten der Original Textdatei in eine (;) separierte .csv Datei. Die Positionen der Feldbezeichner wurden aus der Formatbeschreibungsdatei (Excel Datei) der Bundesnetzagentur entnommen. Der Aufruf

gawk -f txt2csv.awk DVB-T_20071210.txt > DVB-T_20071210.csv

erstellt die .csv Datei. Dieser Ansatz eignet sich besonders für eine Weiterverarbeitung der Rohdaten mit MS Excel oder Open Office.

2.2 Filterung und Erstellung einer .csv Datei

Ziel ist eine einfache Weiterverarbeitung der neu erhaltenen Datei im Batch Betrieb, um die Datenbank in ein anderes Format zu überführen:

- Ausfiltern der relevanten Information (Zeilen)

- Erstellung einer Datei in der die gewünschten Datenfelder mit Separationszeichen voneinander getrennt sind: hier *.csv,  Separatorzeichen semikolon ( ; )

Wie ist der Ablauf?

1.    Manuelles Kopieren und Erstellen der neuen Datenbank Datei mit Namen und Zeitstempel durch den User. DVB-T_YYYYMMTT.txt, YYYY: Jahr: [vierstellig], MM Monat [01..12], TT: Tag [01..31].

2.    Aufruf der Batchdatei filter.cmd mit dem Dateinamen der neu erstellten Datei (mit Extension!) z. B.: filter DVB-T_20071208.txt

3.    Je nach Gestaltung der Filter können eine oder mehrere Dateien erstellt werden

4.    Sichtung der Ergebnisse.

Der Aufruf

filter DVB-T_20071208.txt

erstellt die gefilterte(n) .csv Datei(en), die aufgrund ihrer geringen Größe auch mit einem Texteditor gelesen werden kann.

Die Erläuterung der Details wie z.B. das Setzen der Filter, erfolgt in den nächsten Kapiteln.

3. Format der Textdatei

Das Format der bereitgestellten Textdatei ist in einer ebenfalls auf der Homepage vorhandenen Excel Datei beschrieben. Ich habe die mir wichtigsten Einträge hier gelistet:
Datenf.  Beschreibung                Feldanf. Länge
FELD_1   Dateikenner                 1        4
FELD_2   Sendername                  5        30
FELD_3   Kanal                       35       3
FELD_4   Kanalmittenfrequenz         38       9
FELD_5   Betriebszustand             47       3
FELD_6   Geo Länge (Potsdam Datum)   50       8
FELD_7   Geo Breite (Potsdam Datum)  58       7
FELD_8   Geo Länge (WGS84)           65       8
FELD_9   Geo Breite (WGS84)          73       7
FELD_10  Land geogr.                 80       3
FELD_11  Bundesland geogr.           83       2
FELD_12  Standorthöhe über NN        85       5
FELD_13  Antennenhöhe über Grund     90       3
FELD_14  digitales Fernsehsystem     93       2
FELD_15  Träger- und Schutzintervall 95       1
FELD_16  Frequenzversatz (Hz)        96       8
FELD_17  Art des Versatzes           104      1
FELD_18  ERP-MAX horizontal          105      5
FELD_19  ERP-MAX vertikal            110      5
FELD_20  SFN-Kenner                  115      5
FELD_21  Relativer Zeitversatz       120      6
FELD_22  Polarisation                126      1
FELD_23  Antennencharakteristik      127      1

FELD_134 Land administrativ          682      3
FELD_135 Sendeanlagenschlüssel       685      7
FELD_136 Datum d. Veröffentlichung   692      10
FELD_137 Datum d. Änderung           702      10

Die gewünschten Zahlenpaare werden im Begin Block der (g)awk Datei ‚filter2csv.awk’ als Feld Beschreibung eingetragen.

3. Bearbeitung/Filterung mit dem GNU Tool gawk

Das Tool awk oder die hier verwendete GNU Variante gawk wird von mir zum Filtern und gezielten Auslesen und Ausgeben von Text verwendet.

3.1 Konvertierung in .csv Datei

Das awk Script txt2csv.awk wandelt alle Zeilen der Eingabedatei in eine Semikolon separierte Textdatei um. Die Positionen, an denen ein Separator eingefügt werden soll, werden dem Array f[i] entnommen. Dieses Array wurde vorher mit den Daten gefüllt, die der Beschreibungsdatei im MS Excel Format entnommen wurden (Dazu wurde auch wieder ein awk Aufruf zu Hilfe genommen, nachdem die Exceldatei im .csv Format gespeichert wurden, siehe Kommentar in der awk Datei).

# GAWK Script ”txt2csv.txt”  (KTO 12-dec-2007)
# this gawk script inserts a separator char between all fields in the database
# the result can redirected to a .csv file
#
# parameters: no
#
# description of elements inside the textfile from the "Bundesnetzagentur"
#
# field descriptor table can be extracted from a tab sep. txt file from the excel list with:
# ===> DOS : gawk -F\t "{ print \"f[\" substr($1, 6) \"] = \" $3 \";\" }" feld_beschreibung.txt > fields.txt
# ===> UNIX: gawk -F\t ’{ print "f[" substr($1, 6) "] = " $3 ";" }’ feld_beschreibung.txt > fields.txt
# last entry and 'num' must be inserted in the source code manually
#
# example of usage:
# ===> DOS & UNIX: gawk -f txt2csv.awk DVB-T_20071210.txt > DVB-T_20071210.csv
#
# will be processed before the first line of input
BEGIN {
    f[1] = 1;
    f[2] = 5;
    ...
    f[138] = 712;
    f[139] = 720;
    f[140] = 730;

    num = 140;
    OFS = ";"
}
{
# will be processed for each line of input
    for (i = 1; i < num; i++)
    {
        printf ("%s%s", substr($0, f[i], f[i + 1] - f[i]), OFS);
    }
    print "";
}

# will be processed after the last line of input
END {
}

3.2 Filterung und Erstellung einer .csv Datei

In diesem Fall erfolgt zuerst eine Filterung der gewünschten Zeile und danach die gezielte Extrahierung der zu selektierenden Elemente. Diese werden in einem Array mit Start Position und Länge mit einem Semikolon voneinander getrennt angegeben innerhalb des awk Scripts angegeben.
Der Filterausruf wird in der Batch Datei angegeben.

REM Batch File filter.cmd  Klaus Toscher (12-dec-2007)

REM Filter batch file to extract data from given filename %1

REM param 1: DVB-T textfile from Bundesnetzagentur

REM all DVB-T senders in 'country' e.g. (D) and in 'federal_states' e.g. (HE)

REM gawk "/8M00X7FXFD  .*/"     %1.txt | gawk -f extract.awk > %1_D.txt

REM gawk "/HE.*8M00X7FXFD  .*/" %1.txt | gawk -f extract.awk > %1_D_HE.txt

REM

 

REM ### used tools

SET GAWK=gawk_3_1_0

 

REM ### used scripts

SET GAWK_SCRIPT=filter2csv.awk

 

REM ### selection from 16 german federal states [BB BE BW BY HB HE HH MV NI NW RP SH SL SN ST TH]

REM ### or empty in case of country wide filtering

SET FEDERAL_STATES=HE BY RP NW

REM SET FEDERAL_STATES=

REM ### Regular expression for Country, use always three chars include space followed by .*

REM ### (.) means any char, (*) means no, one or many chars of the predecessor char

REM ### (.*) means [0..oo] characters

REM

REM ### selection of country [AUT, BEL, CZE, D  , DNK, F  , FIN, G  , HOL, I  , LTU, LUX, NOR, POL, S  , SUI]

REM ### country regular expression: three chars with postfix .*  e.g.: F  .*

REM ### more countries: COUNTRY_RE=(D  |FIN|HOL).* ; COUNTRY_EX=D_FIN_HOL

SET COUNTRY_RE=D  .*

REM ### country extension: without whitespaces or postfixes

SET COUNTRY_EX=D

 

IF "%FEDERAL_STATES%" == "" GOTO complete_country

 

REM germany is divided into federal states

FOR %%i in (%FEDERAL_STATES%) DO %GAWK% "/%%i.*8M00X7FXF%COUNTRY_RE%/" %1 | %GAWK% -f %GAWK_SCRIPT% > %~dpn1_%COUNTRY_EX%_%%i.txt

goto end

 

:complete_country

%GAWK% "/8M00X7FXF%COUNTRY_RE%/" %1 | %GAWK% -f %GAWK_SCRIPT% > %~dpn1_%COUNTRY_EX%.txt

 

:end

REM ### DONE ###

#####################################################################################################################

# GAWK Script filter2csv.awk  Klaus Toscher (KTO 03-dec-2007)

# this gawk script reads from $0 all elements which are given by start pos and length

# - prints the extracted elements with a separator char

#

# parameters: no

#

# description of elements inside the textfile from the "Bundesnetzagentur"

#

# all stations from original file are converted:

# >>>  gawk -f extract.awk DVB-T.txt > DVB-T_ALL.txt

#

# only german DVB-T stations from original file are converted:

# >>>  gawk "/8M00X7FXFD  /" DVB-T.txt | gawk -f extract.awk > DVB-T_DE.txt

# regular expression is a concatination of FELD_133 + FELD_134:  "8M00X7FXF" + "D  "

# first gawk filters only german stations, pipes the content to second gawk which translates input to .csv

#

# only german DVB-T stations in hesse from original file are converted:

# >>>  gawk "/HE.*8M00X7FXFD  /" DVB-T.txt | gawk -f extract.awk > DVB-T_DE_HE.txt

# regular expression is a concatination of FELD_11 + any + FELD_133 + FELD_134:  "HE.*8M00X7FXF" + "D  "

# first gawk filters only german stations, pipes the content to second gawk which translates input to .csv

#

 

# will be processed before the first line of input

BEGIN {

    print "# Extract elements from the DVBT Textfile of Bundesnetzagentur, separated by ';' "

    print "# extract from the DVBT Textfile of Bundesnetzagentur"

    f[1]  = "1;4";

    f[2]  = "5;30";

    f[3]  = "35;3";

    f[4]  = "38;9";

    f[5]  = "47;3";

    f[6]  = "50;8";

    f[7]  = "58;7";

    f[8]  = "65;8";

    f[9]  = "73;7";

    f[10] = "80;3";

    f[11] = "83;2";

    f[12] = "85;5";

    f[13] = "90;3";

    f[14] = "93;2";

    f[15] = "95;5";

    f[16] = "96;8";

    f[17] = "104;1";

    f[18] = "105;5";

    f[19] = "110;5";

    f[20] = "115;5";

    f[21] = "120;6";

    f[22] = "126;1";

    f[23] = "127;1";

    f[24] = "682;3";

    f[25] = "685;7";

    f[26] = "692;10";  # datum

    f[27] = "702;10";  # datum

 

    num = 25;

    OFS = ";"

}   

{

    print "";

    for (i = 2; i <= num; i++)

    {

        inx = index(f[i], ";");

        chStart  = substr(f[i], 1, inx - 1);

        chLength = substr(f[i], inx + 1);

        str = substr($0, chStart, chLength);

        # printf ("f[%d]= %s, Index: %d Start: %d Len: %d, str: %s\n", i, f[i], inx, chStart, chLength, str);

        printf ("%s%s", str, OFS);

    }   

}

 

# will be processed after the last line of input

END {

}

4. Tools/Scripts

Die von mir verwendeten Tools und Scripts können hier geladen werden: (Die Datei filter.cmd.txt nach dem Download in filter.cmd umbenennen!)

ToolScript.zip

5. Zusammenfassung/Ausblick

Diese Seite stellt eine von vielen Möglichkeiten vor, wie man die Daten der Bundesnetzagentur weiterverarbeiten kann. Das Tool gawk_3_1_0.exe hat nur Abhängigkeiten auf Windows eigene DLLs. Daher habe ich mich entschlossen es mit zu veröffentlichen, weil neuere Versionen teilweise noch weitergehende Abhängigkeiten aufweisen. Im Falle einer bestehenden cygwin Installation kann diese alternativ verwendet werden.

Die Verarbeitung mit dem GNU Tool gawk kann auch von der Linux Gemeinde problemlos genutzt werden J. Ich gehe davon aus, dass ich dafür keine speziellen Beispiele geben muss. Die Syntax der awk Kommandozeile sieht in diesem Fall ein bisschen anders aus. Der Inhalt dem Batchdatei filter.cmd müsste ebenfalls noch in ein Shell Script konvertiert werden, was aber eigentlich kein Problem darstellen sollte …


14-Dez-2007   Klaus Toscher (Erstellung der Seite)
17-Dez-2007   Klaus Toscher (Überarbeitung der Filterbedingung für gawk)
25-Mai-2009   Klaus Toscher (Link zur Bundesnetzagentur gelöscht)


Referenz

[R-1] sed & awk - kurz & gut  O’REILLYs Taschenbibliothek Deutsche Ausgabe der 2. Auflage 2002

zurück zu DVBT.html