Skip to content

JSONL - JSON Lines text format

Mal wieder etwas Schönes aus dem Entwicklungs-Alltag und was so alles anders kommen kann. Es sollen einige Zehntausend Datensätze aus Export-Dateien in die Datenbank importiert werden.

Abgesprochen waren XML-Dateien, weil das in einer früheren Version der Applikation auch so gehandhabt wurde. Meine Bitte war, dass diese Dateien zumindest komprimiert bereitgestellt werden sollen, damit der Download nicht so lang dauert wie bisher.

Geliefert wurden dann *.json.gz-Dateien, zwar komprimiert, aber wie aus der Dateiendung ersichtlich - kein XML. Egal, ich nehme sehr gern auch JSON. Also die Dateien erstmal entpacken und gucken, ob die Daten auch so aufgebaut sind wie erwartet.

Werkzeug der Wahl ist jq, ein JSON-Prozessor für die Kommandozeile. Damit lässt sich hervorragend ein Überblick über JSON-Daten erhalten, sie sind leicht zu filtern, aufzuteilen, umzuformen. Das klappt auch bei größeren Dateien recht flott - hier sind es einige hundert MB.

Aber jq meckert, es will valides JSON haben, das hier angeblich nicht vorliegt. Ein Blick in die Datei mittels less -S file.json (-S "Chop (truncate) long lines rather than wrapping.") zeigt mir pro Zeile jeweils ein komplexes JSON-Objekt - allerdings nicht kommasepariert in einem Array, sondern tatsächlich getrennt durch einen Zeilenumbruch.

Stellt sich heraus, es gibt das JSON Lines text file format. Und jq lässt sich mittels der Option --slurp (oder kürzer -s) beibringen, auch mit solchen Daten umzugehen. Und schon lassen sich nützliche Dinge mit den JSON-Daten anfangen:

  • Nach einem Objekt-Schlüssel sortieren: jq --slurp --compact-output 'sort_by(.objectId)[]' file.json

  • Anzahl eindeutiger objectIds herausfinden (meine Datei enthielt jede Menge doppelte Datensätze): expr -2 + $(jq -s '[.[].objectId] | unique' file.json | wc -l) Das geht bestimmt noch eleganter (ohne expr -2), aber ich bin halt noch ein jq-n00b; bessere Lösungen bitte in die Kommentare ;-)

Auch nach vielen Jahren Entwicklungserfahrung gibt es also immer noch viel dazuzulernen. Und gerade im Bereich nützlicher Shell-Tools sind nicht zuletzt durch die Verbreitung von Golang und Rust erst in jüngerer Zeit einige nützlicher Helferlein dazugekommen.

Die Daten sind übrigens immer noch nicht importiert - aber das ist ein anderes Thema!

Trackbacks

Keine Trackbacks

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Noch keine Kommentare

Kommentar schreiben

Markdown-Formatierung erlaubt
Wenn Du Deinen Twitter Namen eingibst wird Deine Timeline in Deinem Kommentar verlinkt.
Bewirb einen Deiner letzten Artikel
Dieses Blog erlaubt Dir mit Deinem Kommentar einen Deiner letzten Artikel zu bewerben. Bitte gib Deine Blog URL als Homepage ein, dann wird eine Auswahl erscheinen, in der Du einen Artikel auswählen kannst. (Javascript erforderlich)
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.

Um maschinelle und automatische Übertragung von Spamkommentaren zu verhindern, bitte die Zeichenfolge im dargestellten Bild in der Eingabemaske eintragen. Nur wenn die Zeichenfolge richtig eingegeben wurde, kann der Kommentar angenommen werden. Bitte beachten Sie, dass Ihr Browser Cookies unterstützen muss, um dieses Verfahren anzuwenden.
CAPTCHA

Formular-Optionen

Kommentare werden erst nach redaktioneller Prüfung freigeschaltet!