Zusammenfassung

  • RFC 4180 vom Oktober 2005 beschrieb ein verbreitetes CSV-Format und registrierte text/csv. Das informatorische Dokument benannte Unterschiede zwischen Programmen und ließ die Angabe einer Kopfzeile als optionalen Medientyp-Parameter zu.
  • RFC 7111 vom Januar 2014 definierte Fragmente für Zeilen, Spalten und Zellen: #row=4, #col=2, #cell=4,1. Gezählt wird ab eins. Ein Client ohne Unterstützung erhält weiterhin die vollständige Datei.
  • Die Ziffer bezeichnet eine Position in der gerade empfangenen Tabelle, keine beständige Datensatzkennung. Wird vor Zeile vier eine neue Zeile eingefügt, wählt derselbe Link einen anderen Eintrag. Der Server kann nicht zuverlässig erkennen, ob bei der Anfrage ein Fragment verwendet wurde.

Eine Fußnote mit eingebautem Zeiger

Eine Behörde stellt Entscheidungen als CSV bereit. Eine Autorin möchte die Entscheidung in der vierten Zeile belegen. Ein Link auf die gesamte Datei zwingt Leser zum Öffnen und Suchen. #row=4 am Ende der Adresse wirkt dagegen wie eine direkte Verbindung zur Stelle, die den Satz stützt. Wenige Zeichen versprechen die Präzision einer Fußnote.

Die Schreibweise stammt aus RFC 7111, veröffentlicht im Januar 2014. Er definierte URI-Fragmente für Ressourcen mit dem Medientyp text/csv. row wählt Zeilen, col Spalten, cell ein Feld an der Kreuzung beider Koordinaten. Im Beispiel des RFC steht data.csv#row=4 für die vierte Zeile. Die erste Zeile des Beispiels enthält Spaltenüberschriften. Die vierte Dateizeile ist daher erst der dritte Datensatz. Wer „vierter Eintrag“ sagt und die Kopfzeile vergisst, zeigt schon auf den falschen Platz.

Die CSV-Welt, in die diese Regel kam, war gewachsen und nicht aus einem einzigen Plan entstanden. RFC 4180 vom Oktober 2005 registrierte den Medientyp text/csv und beschrieb übliche Regeln für Kommas, Anführungszeichen, Zeilenenden und optionale Überschriften. Seine Einleitung hält fest, wie lange Tabellenprogramme solche Dateien schon austauschten, obwohl eine gemeinsame formale Beschreibung fehlte. Das Dokument erkennt Unterschiede zwischen Implementierungen ausdrücklich an. Es ist informatorisch; es verwandelte gewachsene Dateien nicht per Beschluss in ein einheitliches Format.

Für die Kopfzeile kann der Medientyp header=present oder header=absent angeben. Fehlt dieser Parameter, muss das lesende Programm selbst entscheiden. Der Fragmentmechanismus zählt dennoch die tatsächlichen Zeilen der empfangenen Datei ab eins. Eine Quellenangabe braucht also zuerst Klarheit darüber, was in der ersten Zeile steht. Ein präziser aussehender Link kann auf einer unklaren Zählgrundlage sitzen.

Die Zahl kennt den Sitz, nicht seinen Besitzer

RFC 7111 erlaubt mehr als eine einzelne Zeile. #col=2 bezeichnet die zweite Spalte, #cell=4,1 das erste Feld der vierten Zeile. Mit einem Bindestrich lässt sich ein Bereich wählen; ein Stern steht für die letzte Zeile oder Spalte; Semikola verbinden mehrere, auch getrennte Auswahlen. Wer Daten auswertet, kann so auf einen kleinen Teil einer fremden Datei verweisen, ohne dass deren Betreiber für jedes Feld eine eigene Webseite pflegt.

Diese Koordinaten tragen keine Identität. In #row=4 stehen weder eine eindeutige Datensatznummer noch ein erwarteter Wert, ein Inhalts-Hash oder eine Fassung der Datei. Der Client zählt in der Version, die er gerade erhalten hat, bis vier und zeigt dort hin. Ob die Autorin des Links Monate zuvor denselben Eintrag gesehen hat, lässt sich aus der Ziffer nicht rekonstruieren.

Angenommen, in Zeile vier stand die Genehmigung eines Vorhabens. Später ergänzt der Herausgeber einen älteren Beschluss oberhalb dieser Stelle. Die Genehmigung rutscht auf Zeile fünf. Die alte URL bleibt erreichbar, das Fragment bleibt syntaktisch korrekt, und eine vierte Zeile gibt es auch noch. Ein Client kann sie mustergültig hervorheben. Gerade diese reibungslose Funktion verdeckt, dass die angezeigte Entscheidung eine andere ist.

Wird eine vorherige Zeile entfernt, verschiebt sich das Ziel in die andere Richtung. Eine neue Sortierung kann viele Verweise gleichzeitig verändern. Das Einfügen einer Spalte verschiebt einen mit #cell= adressierten Wert. Das ist keine Behauptung über einen Programmfehler. Der Effekt folgt aus der Positionsregel selbst. Die Software kann den RFC vollkommen korrekt anwenden und trotzdem einen historischen Beleg verfehlen.

Für einen tatsächlichen Vorfall müsste man eine datierte alte und eine neue Fassung derselben Datei vorlegen und die Position des zitierten Eintrags vergleichen. Die hier herangezogenen Originaldokumente erklären die Möglichkeit; sie melden keinen bestimmten Schadensfall. Wer eine konkrete Fußnote prüfen will, weiß damit, welches Beweisstück fehlt: die Fassung, die beim Schreiben vorlag.

Der Server sieht den Zeiger nicht

Das # in der Adresse hat eine ältere Aufgabe. RFC 3986 vom Januar 2005 beschreibt ein URI-Fragment als indirekten Verweis, den der Client interpretiert. Vor dem Abruf der Hauptressource wird das Fragment abgetrennt. Seine Bedeutung hängt vom zurückgegebenen Medientyp ab, und das Programm des Nutzers löst den Verweis auf den Teil auf. RFC 7111 wendet dieses Prinzip auf CSV an.

Der Server erhält also keine Aufforderung, nur Zeile vier zu schicken. Er liefert die Datei. Ein Client mit Unterstützung für CSV-Fragmente wählt danach den betreffenden Abschnitt. RFC 7111 sagt ausdrücklich, der Server habe keine zuverlässige Möglichkeit festzustellen, ob eine Anfrage mit einem Fragment begann. Sein Zugriffsprotokoll beweist die Auslieferung der Tabelle, nicht die Auswahl einer bestimmten Zeile.

Zwischen Programmen entsteht eine weitere Trennung. Ein unterstützender Client kann die vierte Zeile betonen. Ein älterer oder anders gebauter Client öffnet dieselbe Datei ohne Auswahl und zeigt die gesamte Tabelle. Der RFC behandelt das als Folge schrittweiser Einführung: Die Grundadresse funktioniert weiterhin. Für den Leser kann eine vermeintlich punktgenaue Quellenangabe deshalb wie ein gewöhnlicher Dateidownload aussehen.

Die Freiheit auf der anderen Seite ist beträchtlich. Eine Autorin darf auf einen Teil der veröffentlichten Datei eines Dritten zeigen, ohne dessen Server konfigurieren zu können. Der Datenhalter muss keinen Endpunkt pro Zeile errichten. Aber eine erfolgreiche Antwort des Servers bestätigt weder, was der Client hervorhob, noch was der Leser verstand. Die letzte Etappe der Quellenangabe liegt beim Empfänger.

Auch ungültige Fragmente haben Regeln. Bei fehlerhafter Syntax soll der Client die Angabe ignorieren statt sie zu erraten. Eine einzelne Position jenseits der Dateigröße wird ignoriert, ein zu weit reichender Bereich auf die vorhandene Größe begrenzt. Diese Regeln helfen bei unmöglichen Koordinaten. Sie erkennen keine gültige vierte Zeile, deren Inhalt seit der ursprünglichen Veröffentlichung ausgewechselt wurde.

Der Sicherheitsteil warnt zudem vor Missverständnissen, wenn Software einen markierten Ausschnitt zeigt, andere Software aber die ganze CSV-Datei. Das Dokument beschreibt die Verarbeitung durch unterstützende Clients. Es enthält keinen Kalender der Browser-Versionen, die sie tatsächlich implementierten. Dafür wären datierte Implementierungsaufzeichnungen erforderlich.

Wenn die Adresse länger lebt als ihr Beleg

CSV war im Netz gerade deshalb praktisch, weil eine einfache Datei leicht zu erzeugen und weiterzugeben war. RFC 4180 gab ihr einen registrierten Medientyp; RFC 7111 machte Teile dieser Datei referenzierbar. Das sparte Aufwand auf beiden Seiten. Die dauerhafte Zuordnung eines Satzes zu einem bestimmten Datensatz blieb eine eigene Aufgabe.

Für eine flüchtige Wegbeschreibung mag die aktuelle vierte Zeile genügen. Eine nach Jahren überprüfbare Aussage braucht eine erhaltene, datierte Dateiversion, einen stabilen Datensatzschlüssel oder eine eigene beständige Adresse für den Eintrag. Solche Lösungen kosten Arbeit. Sie sorgen dafür, dass nach dem nächsten Sortieren noch erkennbar ist, welche Entscheidung damals gemeint war.

RFC 7111 erschien als informatorische unabhängige Einreichung; die Änderung der text/csv-Registrierung erhielt die erforderliche IESG-Zustimmung. Der Text definierte, wie eine Position zu wählen ist. Er verlieh dem Datensatz an dieser Position keinen festen Namen. Eine Hausnummer kann bleiben, während der Bewohner auszieht.