Zum Inhalt springen
jsonbeautifiers
Deutsch

CSV in JSON

Trennzeichenerkennung, Felder in Anführungszeichen, und Typerkennung, die Ihre Postleitzahlen nicht frisst.

CSV
JSON

Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen

Wandeln Sie CSV in ein JSON-Array von Objekten um, mit der Kopfzeile als Schlüssel. Trennzeichen werden erkannt, quotierte Felder mit eingebetteten Kommas und Zeilenumbrüchen werden verarbeitet, und doppelte Spaltennamen werden umbenannt statt verworfen.

Die Typerkennung ist standardmäßig aus, und das ist Absicht.

Warum jeder Wert eine Zeichenkette ist, bis Sie etwas anderes sagen

Typerkennung ist die Stelle, an der CSV-Konverter Daten zerstören. Eine CSV hat keine Typen, also muss der Konverter raten, und er rät auf eine Weise falsch, die schwer zu bemerken ist.

Aus 007 wird 7, und die Postleitzahl ist weg. Eine als 1234567890123456789 geschriebene Telefonnummer übersteigt, was eine JavaScript-Zahl halten kann, und kommt verändert zurück. Ein Artikelcode wie 1E5 wird zu 100000. Ein Wert NA wird in einer Zeile zur Zeichenkette und anderswo zum Kopf einer Spalte.

Deshalb sind Zeichenketten die Voreinstellung. Schalten Sie die Erkennung ein, wenn Sie Ihre Daten kennen - und beachten Sie, dass selbst dann führende Nullen erhalten bleiben und jeder Wert, der eine float64-Rundreise nicht überstehen würde, eine Zeichenkette bleibt.

Die CSV-Regeln, über die alle stolpern

Quotierung
RFC 4180: Ein Feld mit Komma, Anführungszeichen oder Zeilenumbruch wird in doppelte Anführungszeichen gesetzt, und ein Anführungszeichen darin wird verdoppelt. Dieser Parser liest das korrekt, mehrzeilige Felder eingeschlossen.
Trennzeichen
Komma, Semikolon, Tabulator und senkrechter Strich werden automatisch erkannt, indem Vorkommen außerhalb von Anführungszeichen über die ersten Zeilen gezählt werden. Europäisches Excel schreibt Semikolons.
Doppelte Kopfzeilen
JSON-Objekte können keine doppelten Schlüssel halten, deshalb bekommt ein wiederholter Spaltenname ein Suffix und die Änderung wird gemeldet. Einen davon wegzuwerfen wäre stiller Datenverlust.
Ungleich lange Zeilen
Eine Zeile mit weniger Feldern als die Kopfzeile bekommt null-Werte; eine mit mehr behält die überzähligen unter einem Schlüssel _extra. Beides wird mit Zeilennummer gemeldet, statt stillschweigend ausgerichtet zu werden.
Das Byte Order Mark
Wird entfernt und gemeldet. Bleibt es stehen, wird es Teil des ersten Spaltennamens, was zu einem auf rätselhafte Weise fehlenden Feld führt.

Verschachtelte Struktur wiederherstellen

Wenn Ihre Kopfzeilen Punktpfade sind, wie in einer CSV, die unser eigener Konverter erzeugt hat, schalten Sie „Punktpfade in den Kopfzeilen aufklappen“ ein: address.city wird dann wieder ein verschachteltes Objekt statt eines Schlüssels, der einen Punkt enthält.

How to do this in code

Umwandeln im Code.

py Python

utf-8-sig entfernt das BOM. dtype=str ist der Weg, pandas daran zu hindern, aus 007 eine 7 zu machen.

import csv, json

# The standard library gives you strings, which is the honest default
with open('in.csv', newline='', encoding='utf-8-sig') as f:
    rows = list(csv.DictReader(f))
print(json.dumps(rows, indent=2))

# pandas infers types, which is convenient and lossy
import pandas as pd
df = pd.read_csv('in.csv', dtype=str)   # dtype=str turns inference OFF
records = df.to_dict(orient='records')
js JavaScript
import Papa from 'papaparse';

const { data, errors } = Papa.parse(csv, {
  header: true,
  skipEmptyLines: true,
  dynamicTyping: false,   // leave it off; see the note above
});
sh Shell
# csvkit
in2csv data.csv | csvjson --indent 2 > data.json

# Or with Miller, which is a single binary
mlr --icsv --ojson cat data.csv

Häufige Fragen

Soll ich die Typerkennung einschalten?
Nur wenn Sie die Daten kennen. Sie liegt meistens richtig, und die Ausnahmen sind genau die Werte, deren Verlust Sie sich nicht leisten können: Postleitzahlen, Kontonummern, Teilenummern, Telefonnummern, alles mit einer führenden Null. Selbst bei eingeschalteter Erkennung lässt dieses Werkzeug sie unangetastet.
Warum sieht mein erster Spaltenname merkwürdig aus?
Ein Byte Order Mark. Dieses Werkzeug entfernt es und sagt das. Ein Parser, der das nicht tut, lässt ein unsichtbares Zeichen am Anfang des Namens stehen, sodass Zugriffe über diesen Namen ohne sichtbaren Grund fehlschlagen.
Kann ich NDJSON statt eines Arrays ausgeben?
Wandeln Sie hier um und nehmen Sie dann die NDJSON-Seite, die aus einem Array einen Datensatz pro Zeile macht. Das ist das bessere Format für alles, was Sie streamen oder anhängen wollen.