DVB-T Senderdaten aus dem Bestand der
Bundesnetzagentur (25-Mai-2009)
Übersicht
1. Senderdaten der Bundesnetzagentur
2. Format der Textdatei
3. Bearbeitung/Filterung mit dem GNU Tool gawk
4. Tools/Scripts
5. Zusammenfassung/Ausblick
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.
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.
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.
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.
Das Tool awk oder die hier verwendete GNU Variante gawk wird von mir zum Filtern und gezielten Auslesen und
Ausgeben von Text verwendet.
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 {
}
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
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
# >>> 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 {
}
Die von mir verwendeten Tools und Scripts können hier
geladen werden: (Die Datei filter.cmd.txt nach dem Download
in filter.cmd umbenennen!)
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