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
objectId
s herausfinden (meine Datei enthielt jede Menge doppelte Datensätze):expr -2 + $(jq -s '[.[].objectId] | unique' file.json | wc -l)
Das geht bestimmt noch eleganter (ohneexpr -2
), aber ich bin halt noch einjq
-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!
Kommentare
Ansicht der Kommentare: Linear | Verschachtelt