Ein Kunde hat mir einen 12.000-reihigen Kundenexport geschickt, der in eine Staging-Datenbank geladen wird. Ich habe es umgebaut, importiert und versendet. Zwei Tage später fragte ihr Ops-Lead, warum einige hundert Kunden in New Jersey vierstellige Postleitzahlen hatten.
07102 war geworden 7102drohen Jeder Zip, der mit einer Null beginnt, über die gesamte Datei, wird leise amputiert. Nicht durch einen Fehler - durch eine Funktion. Type Inference angesehen 07102, sah etwas, das "eine Zahl" übereinstimmte und es hilfreich in eine umwandelte. Führende Nullen sind keine Sache, die Zahlen haben.
Ich habe das gebaut CSV-zu-JSON-Konverter Auf toolz.dev, und das tut es auch. Ich werde Ihnen genau zeigen, wo genau, denn ein Konverter, der Ihre Daten lautlos ändert, ist gefährlicher als einer, der einfach fehlschlägt.
tl; dr: der CSV-zu-JSON-Konverter Verwandelt eine CSV in ein Array von Objekten, wobei die erste Zeile als Schlüssel verwendet wird und vollständig in Ihrem Browser ausgeführt wird. es Verweist immer auf Typen Und Sie können das in der Benutzeroberfläche nicht ausschalten - was bedeutet
07102→7102,1250.50→1250.5, leere Zellen →null, undtrue/false→ Boolesche. Big Integers über 2⁵³ bleiben Strings, wodurch Ihre Twitter-IDs gespeichert werden. Komma-only In der Schnittstelle werden also Semikolon-CSVs von European Excel nicht analysiert. Doppelte Header sind eher ein harter Fehler als ein stilles Überschreiben - das ist eine echte Verbesserung gegenüber den meisten Parsern. Überprüfen Sie die Ausgabe vor dem Import und verwenden Sie die JSON-Formater zu augen.
Was macht dieser Konverter eigentlich mit Ihren Daten?
Jeder Wert in einer CSV ist Text. 29 sind die Zeichen 2 und 9drohen JSON hat echte Typen, also muss ein Konverter entscheiden: 29 die Zahl 29 oder die Zeichenfolge "29"; Es gibt im Allgemeinen keine richtige Antwort, und jeder CSV-Parser rät.
Dieser rät. immer. Hier ist der vollständige Regelsatz, direkt aus dem Code und durch Ausführen:
| CSV-Wert | JSON-Ausgabe | Typ |
|---|---|---|
29 |
29 |
Zahl |
07102 |
7102 |
Nummer - Null weg |
1250.50 |
1250.5 |
Nummer - Cent weg |
true / TRUE |
true |
boolesch |
null / NIL |
null |
ungültig |
| (leere Zelle) | null |
ungültig |
9007199254740993 |
"9007199254740993" |
Schnur |
1e3 |
1000 |
Zahl |
+5 |
"+5" |
Schnur |
.5 |
".5" |
Schnur |
NO |
"NO" |
Schnur |
+8801712345678 |
"+8801712345678" |
Schnur |
2024-01-05 |
"2024-01-05" |
Schnur |
Einige davon verdienen einen genaueren Blick, da das Muster nicht offensichtlich ist.
Die Zahl Regex ist streng und das tragend. Es passt ^-?\d+$ Und sonst nichts. Deshalb +5 und .5 Überleben Sie als Saiten - kein führendes Plus, kein nackter Dezimalpunkt. es ist auch warum +8801712345678 - Eine bangladeschische Telefonnummer, und ich teste mit meiner - kommt intakt durch. streifen das + Und Sie würden es durch numerische Konvertierung verlieren. Die Strenge der Regex schützt also versehentlich Telefonnummern und nur Telefonnummern, die ihren Ländercode plus behalten.
Große ganze Zahlen werden richtig behandelt, was mich überrascht hat. Alles außerhalb des sicheren Ganzzahlbereichs (± 2⁵³−1) wird absichtlich eher als Zeichenfolge als konvertiert und verstümmelt. Schneeflocken-IDs, Twitter-IDs und 19-stellige Datenbankschlüssel überleben. Die meisten naiven Konverter rufen an parseInt und gib dir 9007199254740992 wo du hattest ...93drohen Dieser überprüft zuerst die Bindung.
NO bleibt eine Schnur - Was dem Norwegen-Problem leise ausweicht, das YAML-Dateien isst. Unterschiedliches Format, anderer Parser, aber beachtenswert: der Ländercode NO ist ein Münzflip dafür, wie ein Konfigurations-Parser es behandelt, und hier ist es sicher.
Leer bedeutet NULL, nicht Leerzeichen. Und hier ist ein kleiner Dokumentationsfehler, den ich beim Schreiben gefunden habe: Das Tool 's eigene "Wie es funktioniert" sagt Panel "Leere Werte bleiben als leere Zeichenfolgen in der JSON-Ausgabe erhalten." Sie sind nicht. inferType('') Retouren nulldrohen Der UI-Text ist falsch, der Code ist das, was versendet. Ich repariere die Kopie.
Warum wird 07102 7102 und was mache ich dagegen?
Denn eine Postleitzahl ist keine Nummer und ein Computer kann es nicht sagen.
07102 Passt "Ziffern, optional negativ" an. parseInt("07102", 10) ist 7102drohen Die führende Null hatte Bedeutung - es war Die Daten - und Zahlen haben keine Möglichkeit, sie zu halten. Das gleiche passiert mit:
- Postleitzahlen:
07102,01950, alles in New England oder New Jersey - Produkt-Skus:
00451 - Telefonnummern ohne Plus:
0171... - Bank-/Routing-Codes, Mitarbeiter-IDs, Beliebiger gepolsterter Bezeichner
- Geld:
1250.50→1250.5, und2100.00→2100
Mit dem letzten lohnt es sich zu sitzen. 1250.50 und 1250.5 sind die gleiche Zahl und eine andere Zeichenfolge. Wenn Sie Währungen nachgelagert machen, $1250.5 Wird irgendwo in einer Benutzeroberfläche angezeigt, und jemand wird einen Fehler einreichen, der drei Wochen zuvor auf eine CSV-Konvertierung zurückgeführt wird. (Die eigentliche Lektion ist es, Geld als Ganzzahl-Cent oder eine Dezimalzeichenfolge zu speichern, niemals als Schwimmer - aber das ist ein Kampf um einen anderen Artikel.)
Im Moment gibt es in diesem Tool Kein Schalter, um die Inferenz auszuschalten. Die zugrunde liegende Funktion nimmt eine inferTypes Option und die Benutzeroberfläche übergeben sie nie, daher ist sie dauerhaft am Standard. Das ist eine Lücke und das oberste Element auf meiner Liste für dieses Tool.
Bis es versendet wird, Ihre Optionen:
- Schauen Sie sich die Ausgabe an. Im Ernst - deshalb zeigt das Tool JSON in einem Fenster an, anstatt ihn nur herunterzuladen. Scannen Sie Ihre ID-Spalten. Es dauert zehn Sekunden und so hätte ich die Postleitzahlen abfangen sollen.
- zitiersicher es vorgelagert. Das Zitat in der CSV hilft nicht - die Parser-Zitate und dann Schlüsse also
"07102"wird immer noch7102drohen Machen Sie stattdessen den Wert an der Quelle nicht numerisch: Export alsZIP-07102, oder fügen Sie eine Präfixspalte in der Tabelle hinzu. - Nachbearbeitung. Konvertieren, dann korrigieren Sie die Spalten, die Sie kennen, sind Bezeichner:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0'))drohen Hässlich, aber ehrlich und auditierbar. - Verwenden Sie einen echten Parser für echte Pipelines. für alles geplante oder automatisierte,
csv-parseoder papa parse in node mitcast: falsewird dies richtig machen. Ein Browsertool ist für das Einzelstück.
Was macht der Parser richtig?
Ich war hart darin, also hier ist die andere Hälfte - und einiges davon ist wirklich besser als das, was Sie woanders finden werden.
Doppelte Header sind ein harter Fehler. es zu füttern a,b,a Und es lehnt ab: Duplicate headers found: adrohen Die meisten Parser lassen die letzte Spalte stillschweigend gewinnen, sodass eine Datenspalte ohne ein Wort verschwindet. Lautes Fehlschlagen hier ist der richtige Aufruf - Sie können in einem JSON-Objekt nicht zwei Schlüssel mit demselben Namen haben, und so tun, als würden Sie ansonsten Daten verlieren.
Angeführte Felder werden richtig behandelt, nach RFC 4180. Kommas in Zitaten bleiben gesetzt; "" wird wörtlich "drohen Die Beispieldaten werden mit geliefert "Mike, Jr." speziell um es zu beweisen.
Neuheiten in den angegebenen Feldern funktionieren. Hier stirbt normalerweise handgerollte CSV-Splitting - jemand trennt sich \n und ein mehrzeiliges Adressfeld detoniert die gesamte Datei. Der Zeilenteiler-Spuren zitieren den Status Charakter für Zeichen, also "line1\nline2" bleibt ein Feld.
Leerzeilen werden übersprungen, so dass nachlaufende Zeilen und die streunenden Zeilen-Excel-Blätter am Ende keine Phantomobjekte erzeugen.
Zerlumpte Reihen stürzen nicht ab. Zu wenige Felder und die fehlenden Schlüssel kommen zurück null;; zu viele und die Extras über Ihre Kopfzeilenzahl werden lautlos fallen gelassen. (Dieser letzte Teil, den ich eher als umstritten als um die richtige Nennung bezeichnen würde - eine Warnung wäre besser als eine leise Entsorgung.)
Eine RFC-Abweichung, die Sie wissen sollten: Werte werden gekürzt, einschließlich Insider-Angebote. RFC 4180 §2.4 besagt, dass Räume Teil des Feldes sind und nicht ignoriert werden sollten " John " sollte sein " John "drohen Dieses Werkzeug gibt Ihnen "John"drohen Das ist eine absichtliche Annehmlichkeit - 99% der Zeit, in der sich der Leerlauf in einem CSV befindet, ist ein Unfall, den Sie verschwunden haben möchten - aber wenn Sie Daten umrunden, bei denen das Polstern von Bedeutung ist, ist dies ein verlustbehafteter Schritt und die Spezifikation ist nicht auf meiner Seite.
Warum wird mein Semikolon-CSV-Parse nicht durchgeführt?
Denn die Schnittstelle ist nur Komma, und dies fängt jeden europäischen Export ein.
Excel in einem Gebietsschema, das ein Komma verwendet, da das Dezimaltrennzeichen CSVs mit schreibt Semikolons als Feldbegrenzer. Perfekt gültig, extrem häufig, und dieses Tool wird es nicht analysieren. einkleistern a;b und Sie erhalten einen einzigen Schlüssel, der buchstäblich benannt ist a;b Mit dem Wert "1;2"drohen Es macht keinen Fehler - es erzeugt nur eine nutzlose Spalte, was schlimmer ist als Fehler.
Die Parsing-Funktion akzeptiert a delimiter Option Die Benutzeroberfläche stellt es nie frei. Gleiche Gap-Klasse wie die Inferenz-Umschaltung.
Problemumgehungen:
- Finden und ersetzen
;→,Zuerst in einem Texteditor - sicher nur Wenn kein Feld ein Komma in Anführungszeichen enthält. - betreffs -Export aus Excel mit "CSV UTF-8 (Komma-Abgrenzung)" ;
- Verwenden Sie die CSV-Betrachter Stattdessen - Es wird die Delimitierung durch die Spaltenanzahl über die Kandidatenbegrenzer erfasst, sodass Ihre Semikolondatei gelesen wird. Es wird nicht in JSON konvertiert, aber es zeigt Ihnen, was Sie haben.
Tabs haben das gleiche Problem. Ebenso pfeifenbegrenzt.
Wie konvertiere ich CSV in JSON auf toolz.dev?
Schritt 1: Öffnen Sie den Konverter
Gehe zum CSV-zu-JSON-Konverterdrohen Die Beispieldaten werden geladen und bereits konvertiert, sodass Sie die Form sofort sehen können.
Schritt 2: Fügen Sie Ihre CSV ein
In den linken Bereich einfügen. da ist Kein Datei-Upload - Es ist ein Textbereich, also öffne deine .csv in einem Texteditor und kopieren Sie es über. Für ein paar tausend Zeilen ist das in Ordnung. Verwenden Sie für einen Export von 200 MB einen echten Parser.
Ihre erste Zeile muss Kopfzeilen sein, und Sie benötigen mindestens eine Datenzeile. Eine einzelne Zeile kehrt zurück CSV must have at least a header row and one data rowdrohen
Schritt 3: Konvertieren
stoßen an In JSON konvertierendrohen Sie erhalten eine Reihe von Objekten, eine pro Zeile, Schlüssel aus Ihrem Header, die zwei Leerzeichen eingerückt werden. Die Zeilenanzahl wird über der Ausgabe angezeigt - überprüfen Sie sie mit dem, was Sie erwartet haben, da es sich um den günstigsten Sanity-Test handelt.
Schritt 4: Lesen Sie die Ausgabe, bevor Sie ihr vertrauen
Der Schritt, den alle überspringen und ich habe einmal übersprungen. Schauen Sie sich Ihre ID-Spalten an. Schauen Sie sich Ihre Geldspalten an. Wenn eine Postleitzahl im JSON unnotiert angezeigt wird, ist dies jetzt eine Nummer.
Schritt 5: Kopieren oder herunterladen
nachbilden Für die Zwischenablage, JSON herunterladen für eine data.json Akte
Wann sollte ich keinen Browser-Konverter verwenden?
Ehrlich über die Grenze sein:
| Situation | einsetzen |
|---|---|
| Einmalig, ein paar tausend Reihen | CSV zu JSON |
| sensible Daten, die Sie nicht hochladen können | Dies - es verlässt Ihren Browser nie |
| alles geplant oder automatisiert | csv-parse / Papa-Parse im Knoten |
| Semikolon oder Tab begrenzt | CSV-Betrachter, oder befestigen Sie das Trennzeichen |
| Postleitzahlen, SKUs, gepolsterte IDs | Alles mit cast: false |
| verschachtelte Ausgabe von gepunkteten Headern | ein Skript - Dies erzeugt nur flache Objekte |
| 100k + Zeilen | Streaming-Parser; der Browser hält alles im Speicher |
| Den anderen Weg gehen | JSON zu CSV |
Diese "Nested Output" -Reihe ist es wert, klar zu sagen, da ältere Versionen dieses Leitfadens etwas anderes behaupteten: Header wie user.name und address.city anstellen nicht verschachtelte Objekte werden. Sie erhalten ein flaches Objekt mit einem buchstäblich benannten Schlüssel "user.name"drohen Es gibt keine Punkt-Notations-Erweiterung, keine Header-Transformation, keine Kamel-Umwandlung. Flache Objekte, Tasten genau wie in der Kopfzeile eingegeben – Leerzeichen, Hashes und alles. ein Kopf von Order # gibt Ihnen einen Schlüssel von "Order #", das ist legal JSON und unangenehmer Javascript (row["Order #"]).).
Der Grund, warum dieses Tool erreicht ist, ist der gleiche Grund wie der Rest der Website: Ihre Daten gehen nirgendwo hin. Wenn Sie einen Kundenexport mit echten Namen und E-Mails konvertieren, ist dies keine Kleinigkeit - das Einfügen in einen serverseitigen Konverter bedeutet, dass Sie einem Dritten eine Datei mit persönlichen Daten übergeben, die eine Unterhaltung mit Ihrem Datenschutzbeauftragten sind, die Sie lieber nicht haben. Hier läuft das Parsing in Ihrem Tab. Schalten Sie Ihr WLAN aus und es funktioniert immer noch.
Häufig gestellte Fragen
Warum hat meine Postleitzahl ihre führende Null verloren?
Weil Typinferenz es in eine Zahl konvertiert und Zahlen keine führenden Nullen speichern können. 07102 entspricht dem Muster "nur Ziffern" und wird so 7102drohen Dies betrifft Postleitzahlen, gepolsterte SKUs, Mitarbeiter-IDs und alle Kennungen, die zufällig alle Ziffern sind. Das Zitat in der CSV hilft nicht - Zitate werden entfernt, bevor die Inferenz ausgeführt wird. Überprüfen Sie Ihre ID-Spalten in der Ausgabe oder setzen Sie die Werte an der Quelle voran, um sie nicht numerisch zu machen.
Kann ich die automatische Typkonvertierung deaktivieren?
Nicht in der Schnittstelle. Die zugrunde liegende Funktion unterstützt eine inferTypes Option, aber die Benutzeroberfläche stellt sie nicht dar, daher ist die Inferenz immer aktiv. Wenn Sie rohe Zeichenfolgen benötigen, verwenden Sie einen Bibliotheks-Parser wie Papa Parse oder csv-parse Mit deaktiviertem Casting oder korrigieren Sie die betroffenen Spalten nach der Konvertierung.
Unterstützt es Semikolon oder Tabulatorgetrennte Dateien?
Nein – Die Schnittstelle ist nur Komma. Eine Semikolondatei parsiert in eine Unsinnsspalte, anstatt Fehler zu machen. Achten Sie also darauf. Ersetzen Sie die Semikolons zuerst durch Kommas (sicher nur, wenn kein Angebot ein Komma enthält), exportieren Sie erneut als Komma getrennt oder verwenden Sie den CSV-Viewer, der die Trennzeichen automatisch erkennt.
Was passiert mit leeren Zellen?
Sie werden null, keine leeren Zeichenfolgen. Beachten Sie, dass das Tool "Wie es funktioniert" derzeit das Tool "das Gegenteil" sagt - der Paneltext ist falsch und der Code ist korrekt. Zellen, die den wörtlichen Text enthalten null oder nil auch werden nulldrohen
Kann ich eine CSV ohne Header-Zeile konvertieren?
kein drohen Die erste Zeile wird immer als Header behandelt, und eine Datei mit nur einer Zeile gibt einen Fehler zurück, der besagt, dass ein Header plus mindestens eine Datenzeile erforderlich ist. Wenn Ihre Daten keinen Header haben, fügen Sie vor dem Einfügen einen in einen Texteditor hinzu.
Behandelt es Kommas und Zeilenumbrüche in angegebenen Feldern?
Ja, beides. Der Parser zitiert Statuszeichen für Zeichen, also ein Feld wie "Mike, Jr." Behält sein Komma bei, und ein zitiertes Feld, das eine Zeilenumsetzung enthält, bleibt ein einzelner Wert, anstatt die Zeile zu teilen. entkam doppelten Zitaten ("") wird ein einzelnes wörtliches Angebot gemäß RFC 4180.
Was passiert mit doppelten Spaltennamen?
Es weigert sich zu konvertieren und teilt Ihnen mit, welcher Header dupliziert ist. Das ist absichtlich - ein JSON-Objekt kann nicht zwei identische Schlüssel haben, daher ist die Alternative darin, eine Spalte still zu löschen. Viele Parser tun genau das, benennen Sie die Spalten um und konvertieren Sie erneut.
Gibt es eine Zeilenbegrenzung?
Kein erzwungener Grenzwert, aber alles läuft im Speicher Ihres Browsers: Der CSV-Text, das analysierte Array und die formatierte JSON-Zeichenfolge sind alle gleichzeitig vorhanden. Ein paar tausend Reihen sind bequem, sechsstellige Zeilenzahlen werden den Tab streiten. Verwenden Sie für so große Dateien stattdessen einen Streaming-Parser in Node.
Werden meine Daten irgendwo hochgeladen?
kein . Das Parsen erfolgt in Ihrem Browser und Ihre CSV wird nie übertragen. Dies macht es sicher für den Export von Kunden und andere Daten, die Sie nicht rechtmäßig in ein serverseitiges Tool einfügen könnten. Überprüfen Sie dies auf einfache Weise - öffnen Sie DevTools, beobachten Sie die Registerkarte Netzwerk beim Konvertieren oder schalten Sie einfach Ihr WLAN aus und sehen Sie, dass es immer noch funktioniert.
Die Kurzversion
CSV zu JSON sieht aus wie die langweiligste Konvertierung im Computer und ist es nicht, denn der Moment, in dem ein Parser entscheidet, was Ihre Zeichenfolgen sind subtEs kann in einer Weise falsch sein, die sich nicht ankündigt. Kein Fehler, keine Warnung, nur vierstellige Postleitzahlen, die zwei Tage später auftauchen.
Also: konvertieren, dann Lesen Sie die Ausgabedrohen Überprüfen Sie die Spalten, die als Zahlen vorgeben. Wenn sie nicht zitiert herauskamen, haben Sie etwas verloren. Diese Gewohnheit kostet zehn Sekunden und hätte mir eine peinliche E-Mail erspart.
der CSV-zu-JSON-Konverter Ist gut im Einzelfall - zitierte Felder, eingebettete Zeilen, IDs mit großer Ganzzahl und laute Fehler in doppelten Headern, ohne dass Ihre Daten den Browser verlassen. Es ist nur Komma, es leitet immer Typen und produziert flache Objekte. Jetzt kennen Sie alle drei, bevor sie beißen.
in die andere Richtung gehen: JSON zu CSVdrohen Zum Überprüfen eines unordentlichen CSV: CSV-Betrachterdrohen Zur Überprüfung der Ausgabe: JSON-Formaterdrohen Und wenn Ihre Daten auf eine Konfigurationsdatei zusteuern, json zu Yamldrohen Die breitere Tour ist in der JSON-Tools-Anleitung und das Anleitung für die Coding-Toolsdrohen

