JSON in CSV
Verschachtelte Objekte und Arrays ausdrücklich behandelt, ohne Größenlimit und ohne Upload.
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
CSV ist rechteckig und JSON ist ein Baum, also muss jeder Konverter eine Reihe von Ermessensentscheidungen treffen. Die meisten treffen sie stillschweigend. Diese Seite trifft sie, nennt sie und lässt Sie sie ändern.
Es gibt keine Dateigrößengrenze und kein Tageslimit, weil es keinen Server gibt, der eines verhängen könnte.
Die Spalten sind die Vereinigung, nicht das erste Objekt
Die folgenreichste einzelne Entscheidung. Ein Konverter, der die Schlüssel von Element null liest, verschluckt stillschweigend jedes Feld, das erst in späteren Datensätzen vorkommt - und Sie merken es weiter unten in der Kette, wenn in einem Bericht eine Spalte fehlt.
Dieser hier sammelt jeden Pfad über alle Zeilen, in der Reihenfolge des ersten Auftretens. Das ist langsamer und es ist richtig. Papa Parse, die verbreitetste JavaScript-CSV-Bibliothek, nimmt standardmäßig das erste Objekt und braucht eine ausdrückliche columns-Option für alles andere - gut zu wissen, wenn Sie das selbst bauen.
Arrays innerhalb einer Zeile: vier Regeln, eine Voreinstellung
Das ist der wirklich mehrdeutige Fall, und es gibt keine richtige Antwort, nur eine richtige Voreinstellung.
- Indexspalten, die Voreinstellung
- tags.0, tags.1 und so weiter. Verlustfrei und rückführbar. Ein einziges langes Array lässt die Spaltenzahl explodieren, das ist der Preis.
- In einer Zelle zusammenfassen
- Werte mit einem Semikolon verbunden. Lesbar, verlustbehaftet und unsicher, wenn ein Wert das Trennzeichen enthält.
- JSON in einer Zelle
- Das Array als JSON-Text serialisiert. Verlustfrei und kompakt, muss aber später neu geparst werden.
- In Zeilen auffalten
- Eine Ausgabezeile pro Array-Element, wobei die skalaren Spalten wiederholt werden. Das ist record_path aus json_normalize von pandas. Für eine Eins-zu-viele-Beziehung richtig und für alles andere falsch, deshalb muss man es einschalten und es gilt für einen benannten Pfad.
Zwei Dinge zu Excel, die nicht optional sind
- Das UTF-8-Byte-Order-Mark
- Excel erkennt UTF-8 in einer CSV nicht. Ohne BOM am Dateianfang liest es die Bytes in der Systemcodepage, und jedes Zeichen mit Akzent und jedes Emoji kommt zerstört an. Genau deshalb ist das BOM hier standardmäßig an, und ein Klick schaltet es aus für Verarbeitungsketten, die daran ersticken.
- Formel-Injection
- Eine Zelle, die mit =, +, - oder @ beginnt, wird von Excel, Google Sheets und LibreOffice als Formel ausgeführt. Ein Wert =HYPERLINK("http://evil","klick") in einer von Ihnen erzeugten CSV wird in der Tabelle einer anderen Person zu einem echten Link. Die OWASP nennt das CSV-Injection. Solche Zellen bekommen standardmäßig einen Apostroph vorangestellt, und das Werkzeug sagt Ihnen, wenn es das getan hat.
null gegen leere Zeichenkette
In JSON sind das verschiedene Werte, und Excel zeigt beide leer an - die meisten Konverter werfen sie deshalb zusammen und der Unterschied geht verloren. Hier wird aus null eine leere Zelle ohne Anführungszeichen und aus der leeren Zeichenkette eine leere Zelle mit Anführungszeichen, sodass der Rückweg funktioniert. Das kostet zwei Zeichen pro leerer Zeichenkette und ist es wert.
How to do this in code
Umwandeln im Code, samt der Argumente, die darüber entscheiden, ob es korrekt ist.
py Python, pandas
encoding="utf-8-sig" ist der pandas-Weg, das BOM zu schreiben, das Excel braucht. Ein einfaches utf-8 erzeugt eine Datei, die Excel falsch liest.
import pandas as pd
# Flatten nested objects to dotted columns
df = pd.json_normalize(records)
df.to_csv('out.csv', index=False, encoding='utf-8-sig')
# One row per element of a nested array
df = pd.json_normalize(records, record_path='items', meta=['id']) sh jq
Nehmen Sie @csv statt String-Interpolation. Es erledigt die Quotierungsregeln für Sie.
# Union of keys as the header, then the rows
jq -r '(map(keys) | add | unique) as $c
| $c, (.[] | [.[$c[]]])
| @csv' records.json > out.csv
# @csv quotes and escapes correctly; @text does not js JavaScript
import Papa from 'papaparse';
// Pass the union explicitly. Without it, Papa takes the keys of
// the first object and silently drops the rest.
const columns = [...new Set(records.flatMap(Object.keys))];
const csv = Papa.unparse(records, { columns }); go Go
w := csv.NewWriter(f)
w.Write(columns)
for _, rec := range records {
row := make([]string, len(columns))
for i, c := range columns {
row[i] = fmt.Sprint(rec[c])
}
w.Write(row)
}
w.Flush() Häufige Fragen
- Warum enthält meine CSV in Excel seltsame Zeichen?
- Die Datei ist UTF-8 und Excel hat sie als Systemcodepage gelesen. Lassen Sie die Byte-Order-Mark-Option an. Geht die Datei woandershin als in eine Tabellenkalkulation, schalten Sie sie aus, denn manche Parser behandeln das BOM als Teil des ersten Spaltennamens.
- Warum beginnen manche Zellen mit einem Apostroph?
- Weil sie mit =, +, - oder @ begannen, was Tabellenkalkulationen als Formel ausführen. Der Apostroph entschärft das. Schalten Sie die Option aus, wenn Sie den rohen Wert brauchen und dem Ziel der Datei vertrauen.
- Was, wenn meine Daten kein Array von Objekten sind?
- Ein einzelnes Objekt wird zu einer Zeile. Ein Array von Skalaren wird zu einer Spalte. Eine Hülle wie {"data": [...]} nimmt das innere Array und sagt Ihnen, dass sie diese Wahl getroffen hat, denn das ist eine Vermutung und keine Regel.
- Welches Trennzeichen für europäisches Excel?
- Semikolon. Excel nimmt sein Trennzeichen aus dem Listentrennzeichen des Systems, und das ist in Gebietsschemata, in denen das Komma das Dezimaltrennzeichen ist, ein Semikolon. Deshalb öffnet sich eine kommagetrennte Datei auf einer deutschen oder französischen Maschine als eine einzige Spalte.