3 Einführung des Datenformats

Inhalt
3.1 Das allgemeine Format
3.1.1 Zeichen und Worte
3.1.2 Objekte und Objektklassen
3.1.3 Fakten und Einträge
3.2 Datentypen
3.2.1 Datum
3.2.2 Angaben zu Punkten im Netz
3.2.3 Unbenannte Abschnitte
3.2.4 Zweifel

Nachdem die Konzepte nun eingeführt sind, geht es daran, die Art und Weise der Datenspeicherung zu erläutern. Sie wird dem einen oder anderen Leser vielleicht ungewöhlich erscheinen, verwenden wir doch weder XML noch eine relationale Datenbank. Hintergrund ist, dass die Daten, eine rudimentäre Einführung in das Format vorausgesetzt, auch ohne schwerfällige Hilfsmittel zu lesen und zu verändern sein sollen. Trotzdem soll das Format so gestaltet sein, dass es durch geeignete Werkzeuge aufbereitet und in andere Formate überführt werden kann.

Der letzte Punkt erfordert eine strikte Grammatik und legt die Verwendung von XML nahe. Wer allerdings schon einmal versucht hat, eine XML-Datei nur mit einem Texteditor zu lesen, wird zustimmen, dass der erste Punkt der einfachen Les- und Veränderbarkeit nicht erfüllt ist.

Aus diesem Grunde greifen wir auf eines der ältesten Konzepte der Datenhaltung zurück, nämlich einfache Textdateien, die einer eigenen, speziell für das Projekt entwickelten Grammatik folgen. Diese Grammatik ist einfach genug, um nach nur wenig Übung mit ihr klarzukommen.

Diese Kapitel beschreibt den Aufbau der Daten zunächst in einführender Erzählform. Das nächste Kapitel wird dann die einzelnen Punkte aufgreifen und detailiert erläutern.

Zum Seitenanfang

3.1 Das allgemeine Format

Es wurde bereits erläutert, dass alle Daten in Textdateien enthalten sind. Das heißt, die einzelnen Bits und Bytes in den Dateien werden als Textzeichen interpretiert und in dieser Form verarbeitet. Eine solche Datei wird formalisiert, indem man Regeln aufstellt, welche Zeichen auf welches folgen soll (die Syntax) und was solche Folgen dann zu bedeuten haben (die Semantik). Es gibt endlos viele Möglichkeiten, solche Regeln aufzustellen. Man kann universelle Regeln aufstellen, die nur schlecht zu lesen sind, wie eben XML dies tut, oder eher spezielle Regeln, die den Anforderungen einer bestimmten Anwendung genügen.

Dieses Projekt geht den zweiten Weg. Die Syntax (also die Regeln, welche Zeichen auf welche folgen) ist von der Programmiersprache C inspiriert. Diese hält das Rauschen, nämlich den Anteil der zur Verwaltung nötigen Zeichen im Verhältnis zu tatsächlichen Information klein. Dies hat den Vorteil, dass man beim Lesen nur wenige Zeichen zu erfassen braucht. Der Vorteil beim Schreiben dürfte ohnehin klar sein: Weniger Tipperei.

Aber genug der Vorrede, beginnen wir mit der Erläuterung des tatsächlichen Formats.

Zum Seitenanfang

3.1.1 Zeichen und Worte

Um die Anforderung der Lesbarkeit zu erfüllen, folgen wir am besten der Art und Weise, wie man natürlichsprachliche Texte gruppiert. Zunächst einmal haben wir Buchstaben, Ziffern und Symbole. Diese erfüllen alle unterschiedliche Aufgaben. Buchstaben repräsentieren Laute, Ziffern mathematische Konzepte und Symbole dienen dazu, die Entschlüsselung eines Textes zu unterstützen. So dient der Punkt dazu, das Ende eines Satzes zu kennzeichnen.

Ein weiteres wichtiges Element eines Textes fehlt in der obigen Aufzählung. Es ist dies der Zwischenraum zwischen Zeichen. Dabei ist er ungemein wichtig, indem er die Gruppierung von Zeichen in Worte ermöglicht. EinTextohneZwischenraumliestsichsehrschlecht.

Damit haben wir schon alle Elemente eines Textes und damit einer Textdatei zusammen. Buchstaben und Ziffern enthalten, geeignet zusammengesetzt, die eigentliche Information (nämlich Worte und Zahlen), Leerräume trennen Einheiten auf kleinstem Niveau (wiederum Worte und Zahlen) und Symbole ermöglichen eine Strukturierung auf höherem Niveau (Sätze, Satzteile). Wenn wir dieses Verfahren ausnutzen, dann sollten wir eigentlich einen gut lesbaren Text erhalten.

Dies tun wir und erhalten den folgenden Aufbau. Zunächst gibt es Worte. Sie bestehen aus Buchstaben und Zahlen, sowie den Symbolen Trennstrich (-), Schrägstrich (/), senkrechte Strich (|), Pluszeichen (+), Fragezeichen (?) und Punkt (.)[Dass der Punkt zu den `Buchstaben' gehört ist ein wenig unglücklich, ergibt sich jedoch aus der in der Informatik eingeführten Notation, bei der der Punkt Elemente verschiedener Hierarchiestufen trennt]. Ein Wort endet, wenn ein Repräsentant des Zwischenraums, also ein Leerzeichen, Tabulatorzeichen oder Zeilenvorschub auftritt. Das nächste Wort beginnt, wenn dieser Zwischenraum zu Ende ist. Das heißt, wenn auf ein Leerzeichen ein weiteres folgt, dann gehört dies zum selben Zwischenraum. Dies gilt für beliebig lange Folgen der oben genannten Repräsentanten des Zwischenraums.

Das stimmt so noch nicht ganz. Im ordentlichen Schriftsatz folgen Satzzeichen direkt auf ein Wort ohne einen eingeschobenen Zwischenraum. Das heißt, ein Wort muss auch zu Ende sein, wenn ein `Satzzeichen' folgt. In unserem Fall sind die Satzzeichen: Doppelpunkt (:), Strichpunkt (;), Stern (*), geschweifte, eckige und runde Klammern und das Größer-Als-Zeichen (>). Ihre Bedeutung wird weiter noch unten erklärt.

Nun ergibt sich aber ein echtes Problem. Wenn wir etwa den Namen einer Firma angeben wollen, so kann dieser durchaus selber schon Zwischenraum enthalten, z.B. `Deutsche Bahn AG'. Andererseits wird die Grammatik verlangen, dass der Name nur ein einziges Wort ist, um ihn vom nachfolgenden Text unterscheiden zu können. Das geht aber jetzt irgendwie nicht. Wenn etwas nicht geht, dann benötigt man eine Erweiterung des Konzeptes. In unserem Fall nehmen wir die Art, wie man eine wörtliche Rede in seinen Text einfügt. Man umschließt sie mit Anführungszeichen.

Wir definieren also, dass ein Wort, dass mit einem Anführungszeichen, egal ob einem einfachen oder doppelten, beginnt solange weitergeht, bis wir auf ein weiteres Anführungszeichen des gleichen Typs stoßen. Der Nachsatz `gleichen Typs' soll bedeuten, dass ein mit einem doppelten Anführungszeichen begonnenes Wort auch mit einem doppelten endet, also beliebig viele einfache Anführungszeichen enthalten kann.

Nebenbei bemerkt reden wir hier von den geraden Anführungszeichen, also denen, die auf der deutschen Tastatur über der 2 bzw. dem Doppelkreuz liegen, nicht etwa den typographisch korrekten Symbolen.

Damit haben wir, bis auf einen Spezialfall, das Grundprinzip unserer Grammatik einführt. Das ganze wird nochmals systematisch im nächsten Kapitel zusammengefasst. Dort wird dann auch der Spezialfall beschrieben.

Zum Seitenanfang

3.1.2 Objekte und Objektklassen

Im letzten Kapitel haben wir allerlei Dinge eingeführt, die wir beschreiben wollen können: Strecken, Trassen, Betriebsstellen, Firmen. Ein konkretes solches `Ding' das beschrieben wird, nennen wir ein Objekt, also etwa die Strecke 92100 oder die Betriebsstelle Hinterkleintupfingen.

Die eingeführten Konzepte bezogen sich aber nicht auf einzelne Dinge, sondern immer auf alle Dinge einer gleichen Art. Alle Strecken, alle Betriebsstellen und so weiter. Den Vorgang der Zuordnung von Dingen zu Gruppen gleichartiger Dinge nennt man Klassifizierung und die Gruppen (Objekt-)Klassen.

Wir wissen somit, was wir beschreiben wollen, nämlich Objekte, die zu Objektklassen gehören. Immer wenn wir eine bestimmte Information angeben, werden wir sie mit der Angabe zum Objekt beginnen, auf das sich die Information beziehen soll. Wir wählen dazu die Form `<Objektklasse> <Objekt>', damit ein eher dummes Programm sofort weiß, womit es es zu tun hat.

Was ist `<Objektklasse>'? Ganz einfach ein Wort, dass die Klasse bezeichnet. Es sind dies die Worte `strecke', `trasse', `betrst' und `firma'. Und `<Objekt>' ist der Objektbezeichner, nämlich eine eindeutige Bezeichnung jedes Objektes. Es sind dies die Streckennummer, der Trassenname und die Schlüsselnamen von Betriebsstellen und Firmen.

Zum Seitenanfang

3.1.3 Fakten und Einträge

Eine einzelne Information in ihrer formalisierten Erscheinung nennen wir Fakt. Ein Eröffnungsdatum ist zum Beispiel so ein Fakt, aber auch der Name oder Rang. Ein Fakt ist noch nicht einem bestimmten Objekt zugeordnet, sondern nur die reine Information, also zum Beispiel `eröffnet am 12. Oktober 1893' oder `Rang Bahnhof'.

Ordnet man einen solchen Fakt einem Objekt, nämlich der Strecke oder der Betriebsstelle zu, so entsteht ein Eintrag. Da zu einem Objekt meist ganz viele Fakten auftreten, ist es sinnvoll, in einem Eintrag ganz vielen Fakten sammeln zu können. Andererseits kann es vorteilhaft sein, die Fakten an verschiedenen Punkten anzugeben. So ist es zum Beispiel sinnvoll, die Lage der Betriebsstellen an einer bestimmten Strecke hintereinander weg anzugeben. Die übrigen Fakten zu den Betriebsstellen wird man aber nur einmal angeben, so dass zu den Knotenbahnhöfen mehrere Einträge jeweils im Kontext der verschiedenen Strecken entstehen, aber nur in einem Eintrag die übrigen Fakten wie Rang und Name erscheinen.

Wie sieht ein Eintrag denn nun aus. Machen wir das an einem Beispiel der fiktiven Betriebsstelle Klein Tupfingen an der ebenso fiktiven Strecke 92130:

betrst Klein-Tupfingen {
	lage	-	   92130/12,30		[Mueller02];
	rang	-	   Bf			;
	rang	1982-12-01 Hp			
			   (Stilllegung Stw Tf)	[Mueller02];
	name	-	   "Klein Tupfingen"	;
}

Aha. Was besagt das nun? Die ersten zwei Worte bezeichnen das Objekt, hier die Betriebsstelle mit dem Schlüsselname Klein-Tupfingen. Die öffnende geschweifte Klammer besagt, dass es nun mit den Fakten losgeht. Es folgen sogleich vier Fakten, die Lage, Rang und Name der Betriebsstelle bestimmen. Die vier Fakten beginnen wie alle Fakten mit einem Wort, dass bestimmt, worum es in dem Fakt überhaupt geht. Das nennen wir den Fakttyp und hier sind es die Typen `lage', `rang' und `name'. Alle Fakten gehen nun weiter mit einer bestimmten Anzahl Worte. Diese Worte werden im mathematischen Sinne Argumente genannt. Wieviele das sind und was sie besagen, hängt vom Fakttyp ab. Unsere drei Typen bestehen alle aus zwei Worten, das erste gibt das Datum an, das zweite die Lage, den Rang bzw. den Namen. Das Datum `-' besagt, dass das frühestmögliche Datum anzuwenden ist, hier vermutlich die Eröffnung der Strecke 92130. Rang taucht zweimal auf, was uns erklären will, dass die Betriebsstelle als Bahnhof eröffnet wurde und zum 1. Dezember 1982 zum Haltepunkt zurückgebaut wurde.

Auf die vom Faktentyp vorgegebene Wortzahl (wobei einige Faktentypen optionale Argumente haben) kann nun eine Bemerkung in runden Klammern folgen, auf die wiederum beliebig viele Referenzen zu Quellen folgen dürfen, die in eckigen Klammern stehen. In unserem Beispiel hat der zweite Rang-Fakt eine Bemerkung sowie eine Referenz auf die Quelle `Mueller02'.

Am zweiten Rang-Fakt kann man ebenfalls erkennen, dass Zeilenumbrüche keine Bedeutung haben. Es ist vielmehr so, dass man beim Editieren von Einträgen darauf achten sollte, eine Zeilenlänge von 80 Zeichen nicht zu überschreiten. Dann können die Einträge auch auf primitiven Displays oder Druckern ausgegeben werden. Wo wir gerade bei Stilfragen sind: Im Beispiel sieht man auch, dass gleichartige Elemente in der gleichen Textspalte beginnen. Ein solches Vorgehen ist der Lesbarkeit natürlich sehr zuträglich.

Zum Seitenanfang

3.2 Datentypen

Die bisherige Tiefe der Formalisierung reicht noch nicht aus. Bislang können wir nur Worte hinschreiben. Ein Computerprogramm kann sie entweder nehmen, wie sie sind (z.B. den Namen einer Betriebsstelle) oder mit vorgegebenen Worten vergleichen (Objektklassen und Fakttypen). Wenn wir aber die Lage einer Betriebsstelle angeben, so soll das Programm daraus Strecke und Punkt auf dieser Strecke ermitteln können. Geben wir zwei Kalenderdaten an, so soll das Programm diese vergleichen können.

Dazu brauchen wir eine genaue Beschreibung, wie Lage-Angaben und Daten aufgebaut sein sollen. Dies wollen wir in diesem Abschnitt tun. Er enthält wiederum eine Prosabeschreibung. Die genauen Regeln befinden sich im Anhang.

Zum Seitenanfang

3.2.1 Datum

Von den vielen verschiedenen Möglichkeiten, ein Datum darzustellen, verwenden wir die von DIN und ISO propagierte Schreibweise, die ein Datum in Jahr, Monat und Tag anordnet und diese durch Bindestriche trennt. Der 6. Dezember 1982 wird also als 1982-12-06 geschrieben. Die einzelnen Teile müssen auf 4 bzw. 2 Ziffern aufgefüllt werden, wie man dies bei der 6 im Beispiel sehen kann.

Das reicht uns aber noch nicht. Denn wir wollen außerdem Zeiträume und Alternativen darstellen können. Ersteres begegnet uns etwa, wenn wir den Abbau einer Strecke beschreiben wollen: Abgebaut vom 3. Juni 1974 bis 18. Juni 1974. Dieses `bis' drücken wir durch den Operator / (Schrägstrich) aus, mit dem wir einfach zwei Datumsangaben verbinden: 1974-06-03/1974-06-18. Beachte, dass nirgendwo Leerzeichen eingeschoben werden dürfen, da ja sonst das Wort und damit das Datum zu Ende wäre.

Alternativen werden genauso angegeben, nur das der Schrägstrich durch den senkrechten Strich | ersetzt wird, der für `oder' steht. Bei einer Alternative dürfen auch mehr als zwei Daten angebenen werden, was bei einem Zeitraum eher sinnfrei ist.

Schließlich führen wir noch eine Abkürzung ein, nämlich eine Datumsangabe, die nur aus einem Bindestrich - besteht. Sie soll `frühestmöglich' bedeuten. Sie wird etwa verwendet, wenn wir den Eröffnungszustand einer Strecke beschreiben. Wir müssten dann bei Lage, Rang und Name jeder Betriebsstelle das Eröffnungsdatum der Strecke eintragen. Das ist aber erstens viel zu viel Schreibarbeit und zweitens recht unpraktisch, sollten wir feststellen, dass das Eröffnungsdatum falsch war. Wir tragen also überall nur - als Datum ein und ein Programm kann dieses Datum automatisch durch das richtige ersetzen, sollte es nötig werden.

Zum Seitenanfang

3.2.2 Angabe von Punkten im Netz

Sehr häufig werden wir beschreiben müssen, wo sich ein bestimmter Punkt im Netz befindet. Wir haben im letzten Kapitel gesehen, dass wir dazu eine Strecke oder Trasse und eine Kilometerangabe auf dieser verwenden. Das ermöglicht es, drei verschiedene Angaben zu Netzpunkten zu machen: Strecke/Trasse und Kilometer, nur Kilometer oder nur Strecke/Trasse (Das letzte gibt natürlich keinen Punkt an). Wir werden fürderhin für diese drei Möglichkeiten die Begriffe Netzpunkt, Streckenpunkt und Strecke verwenden. Beachte, dass der Begriff Strecke in diesem Zusammenhang Trassen automatisch einschließt.

Einen Streckenpunkt geben wir an, wenn wir im Kontext einer Strecke arbeiten. Hier wäre es müßig, jedesmal die Streckennummer mit anzugeben. Diese kennen wir ja bereits. Für die Angabe eines Streckenpunktes gibt es zwei Möglichkeiten. Entweder es wird direkt eine Kilometerangabe gemacht, oder wir beziehen uns auf die Lage einer Betriebsstelle. Wollen wir uns darauf beziehen, geben wir einfach den Schlüsselnamen der Betriebsstelle an.

Ansonsten müssen wir Kilometer direkt angeben. Das Format dazu ist das für Dezimalbrüche in Deutschland übliche, nämlich ganzzahliger Teil -- Komma -- Nachkommastellen. Es werden immer genau so viele Nachkommastellen angegeben wie bekannt sind. Dass heißt, wenn die Angabe auf 10 Meter genau bekannt ist, aber die letzte Stelle eine Null wäre so darf diese nicht weggelassen werden, da man dann auf eine auf 100 Meter genaue Angabe schließen könnte. Die Angabe 13,1 ist also von 13,10 derart verschieden, dass die erste Angabe aus dem Bereich 13,05 bis 13,14 gerundet sein kann, die zweite aber nicht.

Schwieriger wird es, wenn wir Trassenverlegungen beachten müssen. Wird eine Strecke dadurch verkürzt, haben wir kein Problem, ein bestimmter Bereich der Kilometerangaben wird einfach ungültig. Ein solcher Sprung heißt »Fehlstelle«. Wenn aber die Strecke verlängert wird, dann müssen wir einige Meter einschieben, es entsteht eine »Überlänge« Um Punkte auf dieser Überlänge angeben zu können, wird zunächst ihr Beginn angegeben. Darauf folgt ein Pluszeichen und eine Angabe über die Entfernung von diesem Punkt. Diese letzte Angabe erfolgt in Metern. Ist sie nur auf 10 oder 100 Meter genau bekannt, werden die unbekannten Zehner- und Einerstellen nicht mit Null angegeben, sondern mit einem Punkt.

Das Bild links stellt die Situation einer Streckenverlegung dar. Die ursprüngliche Strecke verlief direkt vom Punkt A zum Punkt D. Später wurde die Strecke in einem großen Bogen via die Punkte B und C neu trassiert. Die neue Kilometierung läuft auf dieser Verlegung zunächst ganz normal weiter bis zum Punkt B. Hier erreicht sie den selben Wert, wie in Punkt D der alten Trasse. Der Einschub beginnt. Punkt C ist eine neue Station auf der verlegten Trasse. Wir kennen ihre Lage nur auf 100 Meter genau und geben sie deshalb mit 53,120+1.. an. In Punkt D endet die verlegte Trasse und auch der Einschub. Er ist 452 Meter lang, also erhält D den neuen Kilometerwert von 53,120+452. Hinter D geht die orignale Kilometierung weiter.

Nun, da wir Streckenpunkte beschreiben können, ist es nicht mehr weit bis zu Netzpunkten. Alles was wir dazu noch brauchen ist die Streckenangabe. Die kennen wir schon, denn sie ist nichts anderes als die Strecken- oder Trassennummer. Beides wird mittels eines Schrägstrichs zu einem Netzpunkt kombiniert. Wenn also die oben gezeichnete Strecke die Nummer 92130 trüge, dann wird Punkt C beschrieben als 92130/53,120+1.. Falls die verlegte Trasse 92130Ax2 heißt, dann könnten wir ihn genauso ansprechen mittels 92130Ax2/53,120+1.. wenn wir Angaben für die Zeit machen wollen, da die neue Trasse noch nicht zur Strecke gehört hat.

Zum Seitenanfang

3.2.3 Unbenannte Abschnitte

Ebenso häufig müssen wir Abschnitte angegeben, zum Beispiel immer dann, wenn wir das Eröffnungsdatum einer Teilstrecke eintragen wollen. Ein solcher Abschnitt besteht aus zwei Streckenpunkten, nämlich dem Anfangspunkt und dem Endpunkt, die durch den Operator > getrennt werden. Die Verwendung eines Operators hat zur Folge, dass zwischen Anfangspunkt und > sowie zwischen > und Endpunkt Leerzeichen stehen dürfen, aber nicht müssen.

Einen Sonderfall gibt es noch. Für den Beginn und das Ende einer Strecke kann man statt eines Streckenpunktes auch den Operator * eintragen. Dies ist zum Beispiel zwingend nötig, wenn man einen benannten Abschnitt definiert, der am Streckenanfang beginnt und an einem bestimmten Punkt endet. Man benötigt ihn, wenn es eine Neutrassierung am Streckenanfang gab.

Zum Seitenanfang

3.2.4 Zweifel

Was uns außerdem zuweilen begegnet, ist Zweifel an Datumsangaben. Dieser tritt in zwei Formen auf. Entweder ist der Zweifel bereits in der Quelle aus der wir unsere Daten beziehen enthalten oder wir haben die Daten auf `ungewöhnlichem' Wege erlangt und wollen darstellen, dass wir selbst, also die Eintragenden, den Daten nicht so recht trauen. Ein Beispiel für letzteres wäre es, die Lage einer Betriebsstelle aus einem Kursbuch zu ermitteln. Die Zahlenwerte dort weichen gelegentlich aufgrund von Rundungsfehlern von den tatsächlichen Zahlen ab.

Zweifel drücken wir vernünftigerweise durch Fragezeichen aus. Ein Fragezeichen steht für offiziellen Zweifel, also solchen bereits in der Quelle vorkommenden. Zwei Fragezeichen stehen für Zweifel des Eintragenden. Die Fragezeichen werden immer hinten angehängt. Bei Zweifel an der Lage einer Betriebsstelle für der Netzpunkt etwa so angegeben: `92130/23,1??'.

Die doppelten Fragezeichen dürfen auch alleine stehen. Sie bedeuten dann einen unbekannten Wert. Sie stehen etwa für eine unbekannte Lage einer Betriebsstelle oder wenn wir zwar wissen, dass ein Ereignis stattgefunden hat, aber nicht, wann.

Zum Seitenanfang

Zuletzt geändert am 7. III. 2003.
Anregungen, Kommentare und Kritik an Martin Hoffmann <hn@nvnc.de>.