Un cliente mi ha inviato un'esportazione di clienti di 12.000 righe da caricare in un database di staging. L'ho convertito, importato e spedito. Due giorni dopo il loro comando operativo ha chiesto perché alcune centinaia di clienti nel New Jersey avevano codici postali a quattro cifre.
07102 era diventato 7102. Ogni zip che inizia con uno zero, su tutto il file, amputato silenziosamente Non da un bug - da una funzione L'inferenza del tipo guardata 07102, ho visto qualcosa che corrispondeva a "un numero", e lo ha convertito in modo utile in uno. Gli zeri iniziali non sono una cosa che i numeri hanno.
Ho costruito il Convertitore da CSV a JSON su Toolz.dev, e lo fa anche. Ti mostrerò esattamente dove, perché un convertitore che cambia silenziosamente i tuoi dati è più pericoloso di uno che fallisce.
tl; dr: la Convertitore da CSV a JSON Trasforma un CSV in una matrice di oggetti, utilizzando la prima riga come chiavi, in esecuzione interamente nel tuo browser. le Deduce sempre i tipi e puoi't spegnerlo nell'interfaccia utente, il che significa
07102→7102,1250.50→1250.5, celle vuote →null, etrue/false→ booleani. Big Integers oltre 2⁵³ Stay Strings, che salva i tuoi ID Twitter. solo virgola nell'interfaccia, quindi i CSV punto e virgola di European Excel hanno vinto' t parse. Le intestazioni duplicate sono un errore grave piuttosto che una sovrascrittura silenziosa: quella one' è un miglioramento reale rispetto alla maggior parte dei parser Controlla l'output prima di importare e utilizza il file Formattatore JSON per guardarlo.
Cosa fa effettivamente questo convertitore ai tuoi dati?
Ogni valore in un CSV è testo. 29 sono i personaggi 2 e 9. JSON ha tipi reali, quindi un convertitore deve decidere: è 29 il numero 29 o la stringa "29"? Non c'è una risposta giusta in generale, e ogni parser CSV indovina.
questo indovina. sempre. Ecco il set di regole completo, direttamente dal codice e verificato eseguendolo:
| Valore del csv | Uscita JSON | tipo |
|---|---|---|
29 |
29 |
somma |
07102 |
7102 |
numero - zero andato |
1250.50 |
1250.5 |
numero - centesimo andato |
true / TRUE |
true |
booleano |
null / NIL |
null |
nullo |
| (cella vuota) | null |
nullo |
9007199254740993 |
"9007199254740993" |
legare con uno |
1e3 |
1000 |
somma |
+5 |
"+5" |
legare con uno |
.5 |
".5" |
legare con uno |
NO |
"NO" |
legare con uno |
+8801712345678 |
"+8801712345678" |
legare con uno |
2024-01-05 |
"2024-01-05" |
legare con uno |
Alcuni di questi meritano uno sguardo più da vicino, perché il modello non è ovvio.
Il numero regex è rigoroso e questo è portante. Corrisponde ^-?\d+$ E nient'altro. Ecco perché +5 e .5 sopravvivere come stringhe - nessun vantaggio principale più, nessun punto decimale nudo It's anche perché +8801712345678- un numero di telefono del Bangladesh, e io provo con il mio - ne esce intatto Strip that + E lo perderesti a causa della conversione numerica. Quindi la severità della regex protegge accidentalmente i numeri di telefono e solo i numeri di telefono che mantenevano il loro codice paese in più.
I grandi numeri interi sono gestiti correttamente, il che mi ha sorpreso. Qualsiasi cosa al di fuori dell'intervallo intero sicuro di JavaScript (±2⁵³−1) viene deliberatamente mantenuto come una stringa piuttosto che convertita e maciullata. Sopravvivono ID fiocchi di neve, ID Twitter e chiavi del database a 19 cifre. La maggior parte dei convertitori ingenui chiama parseInt e consegnarti 9007199254740992 dove avevi ...93. Questo controlla prima il limite.
NO rimane una stringa- che schiva silenziosamente il problema Norvegia che mangia i file YAML Formato diverso, parser diverso, ma vale la pena notare: il codice paese NO è un lancio di monete per come lo tratta un parser di configurazione, ed eccolo sicuro.
Vuoto significa NULL, non stringa vuota. Ed ecco un piccolo bug di documentazione che ho trovato scrivendo questo: il pannello dello strumento "come funziona" dice "I valori vuoti vengono conservati come stringhe vuote nell'output JSON". Non sono. inferType('') rientro null. Il testo dell'interfaccia utente è sbagliato, il codice è quello che viene spedito. Sto aggiustando la copia.
Perché 07102 diventa 7102 e cosa devo fare al riguardo?
Perché un codice postale non è un numero e un computer non può dirlo.
07102 Corrisponde a "cifre, opzionalmente negative" perfettamente. parseInt("07102", 10) è 7102. Lo zero iniziale aveva un significato: esso era i dati - e i numeri non hanno modo di trattenerli La stessa cosa accade a:
- codici postali:
07102,01950, qualsiasi cosa nel New England o nel New Jersey - SKU PRODOTTO:
00451 - Numeri di telefono senza un vantaggio:
0171... - Codici bancari/instradamento, ID dipendente, Qualsiasi identificatore imbottito
- importi:
1250.50→1250.5, e2100.00→2100
Vale la pena sedersi quest'ultimo. 1250.50 e 1250.5 sono lo stesso numero e una stringa diversa. Se stai eseguendo la resa della valuta a valle, $1250.5 verrà visualizzato in un'interfaccia utente da qualche parte e qualcuno presenterà un bug che richiede un'ora per risalire a una conversione CSV tre settimane prima. (La vera lezione che c'è è archiviare denaro come centesimi interi o stringa decimale, mai un float, ma quello e n. 39; è una lotta per un articolo diverso.)
In questo momento, in questo strumento, c'è Nessun interruttore per disattivare l'inferenza. La funzione sottostante prende un inferTypes l'opzione e l'interfaccia utente non la passa mai, quindi è attiva, in modo permanente, al valore predefinito. Questo è un divario ed è l'elemento in cima alla mia lista per questo strumento.
Fino alla spedizione, le tue opzioni:
- Guarda l'output. Seriamente - questo è il motivo per cui lo strumento mostra JSON in un riquadro invece di scaricarlo semplicemente Scansiona le tue colonne ID. Ci vogliono dieci secondi e it' è come avrei dovuto catturare i codici postali.
- a prova di citazione a monte. Citando nel CSV won't help - il parser spoglia le citazioni e poi deduce, quindi
"07102"diventa ancora7102. Invece, rendi il valore non numerico all'origine: esporta comeZIP-07102o aggiungere una colonna di prefisso nel foglio di calcolo. - Post-processo. Converti, quindi correggi le colonne che sai essere identificatori:
data.forEach(r => r.zip = String(r.zip).padStart(5, '0')). Brutto, ma onesto e verificabile. - Usa un vero parser per pipeline reali. per qualsiasi cosa programmata o automatizzata,
csv-parseo Papa analizzare in nodo concast: falselo farà correttamente. Uno strumento per browser è per l'unica.
Cosa fa bene il parser?
I' sono stato duro, quindi qui' è l'altra metà - e parte di questo è veramente migliore di quello che tu' troverò altrove.
Le intestazioni duplicate sono un errore difficile. nutrirlo a,b,a E rifiuta: Duplicate headers found: a. La maggior parte dei parser lascia in silenzio vincere l'ultima colonna, quindi una colonna di dati svanisce senza una parola. Fallire ad alta voce qui è la chiamata giusta: non è possibile avere due chiavi con lo stesso nome in un oggetto JSON e fingere altrimenti perdere dati.
I campi quotati vengono gestiti correttamente, per RFC 4180. Le virgole all'interno delle citazioni rimangono; "" diventa un letterale ". I dati di esempio vengono forniti con "Mike, Jr." in particolare per dimostrarlo.
Le nuove righe all'interno dei campi citati funzionano. È qui che di solito muore la spaccatura CSV arrotolata a mano: qualcuno si divide \n e un campo di indirizzo multilinea fa esplodere l'intero file. Lo splitter di riga traccia lo stato per carattere per citazione, quindi "line1\nline2" rimane un campo.
le righe vuote vengono saltate, quindi le nuove righe finali e le foglie di Excel di riga vuote vaganti alla fine non producono oggetti fantasma.
Le righe irregolari non si bloccano. Troppo pochi campi e le chiavi mancanti tornano null; troppi e gli extra oltre il conteggio dell'intestazione vengono eliminati silenziosamente. (Quell'ultima parte I'd chiama discutibile anziché corretto: un avviso sarebbe meglio di uno scarto silenzioso.)
Una deviazione RFC da conoscere: I valori vengono ritagliati, comprese le virgolette interne. RFC 4180 §2.4 afferma che gli spazi fanno parte del campo e non dovrebbero essere ignorati, quindi " John " dovrebbe essere " John ". Questo strumento ti dà "John". That' è una comodità deliberata - il 99% delle volte trascinare gli spazi bianchi in un CSV è un incidente che vuoi che scompaia - ma se tu' sono dati di andata e ritorno in cui l'imbottitura è significativa, it' è un passo con perdita e le specifiche non sono dalla mia parte.
Perché non ho avuto il mio punto e virgola CSV?
Perché l'interfaccia è solo virgola e questo cattura ogni esportazione europea.
Excel in una locale che utilizza una virgola mentre il separatore decimale scrive CSV con punto e virgola come delimitatore di campo. Perfettamente valido, estremamente comune, e questo strumento non lo analizzerà. pasta a;b E ottieni una singola chiave chiamata letteralmente a;b con il valore "1;2". Fa' t errore: produce solo una colonna inutile, che è peggio dell'errore.
La funzione di analisi accetta a delimiter opzione. L'interfaccia utente non lo espone mai. Stessa classe di gap dell'inferenza.
Soluzioni:
- trovare e sostituire
;→,in un editor di testo prima - sicuro soltanto Se nessun campo contiene una virgola tra virgolette. - con riferimento a -Esporta da Excel con "CSV UTF-8 (delimitato da virgola)".
- Usa il Visualizzatore CSV invece, rileva il delimitatore ottenendo un punteggio di coerenza nel conteggio delle colonne tra i delimitatori candidati, quindi leggerà il tuo file punto e virgola. Ha vinto't converti in JSON, ma it' ti mostrerà quello che hai.
Le schede hanno lo stesso problema. Così fa delimitato da pipe.
Come faccio a convertire CSV in JSON su Toolz.dev?
Passaggio 1: apri il convertitore
Vai al Convertitore da CSV a JSON. I dati di esempio vengono caricati e già convertiti, quindi puoi vedere immediatamente la forma.
Passaggio 2: incolla il tuo CSV
Incolla nel riquadro sinistro. c'è Nessun caricamento di file- it's un'area di testo, quindi apri il tuo .csv in un editor di testo e copiarlo. Per alcune migliaia di righe va bene. Per un'esportazione da 200 MB, utilizzare un parser reale.
La prima riga deve essere intestazioni e hai bisogno di almeno una riga di dati. Una singola riga restituisce CSV must have at least a header row and one data row.
Passaggio 3: convertire
urto Converti in JSON. Ottieni una serie di oggetti, uno per riga, chiavi dall'intestazione, due spazi rientrati Il conteggio delle righe appare sopra l'output: controllalo rispetto a ciò che ti aspettavi, poiché it' è il test di sanità mentale più economico possibile.
Passaggio 4: leggi l'output prima di fidarti
Il passo che tutti salta e io ho saltato una volta. Guarda le tue colonne ID. Guarda le tue colonne di denaro. Se un codice postale viene visualizzato non citato nel JSON, ora è un numero.
Passaggio 5: copia o scarica
copia Per gli appunti, Scarica JSON per un data.json file.
Quando non dovrei utilizzare un convertitore di browser?
Essere onesti sul confine:
| situazione | maneggiare |
|---|---|
| Una tantum, poche migliaia di righe | CSV a JSON |
| Dati sensibili che non puoi caricare | Questo - non lascia mai il tuo browser |
| Qualsiasi cosa programmata o automatizzata | csv-parse / Papa analizza nel nodo |
| punto e virgola o delimitato da tabulazioni | Visualizzatore CSV, o correggere il delimitatore |
| CAP, SKU, ID imbottiti | QUALSIASI CO cast: false |
| Uscita nidificata da intestazioni tratteggiate | Uno script: produce solo oggetti piatti |
| 100.000+ righe | Parser in streaming; il browser conserva tutto in memoria |
| Andando dall'altra parte | JSON a CSV |
Quella riga di "output nidificata" vale la pena affermare chiaramente poiché le versioni precedenti di questa guida affermavano diversamente: intestazioni simili user.name e address.city truffa no diventare oggetti nidificati. ottieni un oggetto piatto con una chiave letteralmente denominata "user.name". There's nessuna espansione di dot-notation, nessuna trasformazione di intestazione, nessuna conversione di camelCase Oggetti piatti, tasti esattamente come digitati nella riga di intestazione - spazi, hash e tutto Un'intestazione di Order # ti dà una chiave di "Order #", che è legale JSON e JavaScript imbarazzante (row["Order #"]).
Il motivo per raggiungere questo strumento è lo stesso motivo del resto del sito: i tuoi dati non vanno & #39; andare ovunque Se tu & #39; stai convertendo un'esportazione di clienti con nomi ed e-mail reali al suo interno, che & #39; non è una cosa da poco - incollarlo in un convertitore lato server significa consegnare a terzi un file di dati personali, che è una conversazione con il tuo DPO tu' preferire di non avere Qui l'analisi viene eseguita nella scheda Spegni il Wi-Fi e funziona ancora.
Domande frequenti
Perché il mio codice postale ha perso il suo zero iniziale?
Perché il tipo di inferenza l'ha convertito in un numero e i numeri non possono memorizzare gli zeri iniziali. 07102 corrisponde al modello "solo cifre", quindi diventa 7102. Ciò influisce sui codici postali, sulle SKU imbottite, sugli ID dei dipendenti e su qualsiasi identificatore che risulti essere tutte le cifre Citandolo nel CSV won' t help - le virgolette vengono eliminate prima dell'esecuzione dell'inferenza Controlla le colonne ID nell'output o prefissa i valori all'origine per renderli non numerici.
Posso disattivare la conversione automatica del tipo?
non nell'interfaccia. La funzione sottostante supporta un inferTypes opzione, ma l'interfaccia utente non la espone, quindi l'inferenza è sempre attiva. Se hai bisogno di stringhe grezze, usa un parser di libreria come Papa Parse o csv-parse con casting disabilitato o correggere le colonne interessate dopo la conversione.
Supporta i file delimitati da punto e virgola o tabulazioni?
No - l'interfaccia è solo virgola Un file punto e virgola viene analizzato in una colonna senza senso anziché in errore, quindi fai attenzione. Sostituisci prima i punti e virgola con virgole (sicuro solo se nessun campo citato contiene una virgola), riesporta da Excel come delimitato da virgola o utilizza il visualizzatore CSV, che rileva automaticamente i delimitatori.
Cosa succede alle celle vuote?
diventano null, non stringhe vuote Nota che lo strumento's proprio & quot; Come funziona" pannello attualmente dice il contrario - il testo del pannello è sbagliato e il codice è corretto Celle contenenti il testo letterale null oppure nil diventare anche null.
Posso convertire un csv senza una riga di intestazione?
no . La prima riga viene sempre trattata come intestazione e un file con una sola riga restituisce un errore che dice che ha bisogno di un'intestazione più almeno una riga di dati. Se i tuoi dati non hanno un'intestazione, aggiungine una in un editor di testo prima di incollarla.
Gestisce le virgole e le interruzioni di riga all'interno dei campi citati?
Sì, entrambi. Il parser traccia la citazione dello stato per carattere, quindi un campo simile "Mike, Jr." Mantiene la sua virgola e un campo citato contenente una nuova riga rimane un singolo valore invece di dividere la riga. Citazioni doppie sfuggite ("") diventare un'unica citazione letterale, per RFC 4180.
Cosa succede con i nomi delle colonne duplicati?
Si rifiuta di convertire e ti dice quale intestazione è duplicata. That's deliberate - un oggetto JSON può' t avere due chiavi identiche, quindi l'alternativa è far cadere silenziosamente una colonna Molti parser fanno esattamente questo; rinominare le colonne e convertire di nuovo.
C'è un limite di riga?
Nessun limite imposto, ma tutto viene eseguito nella memoria del browser: il testo CSV, l'array analizzato e la stringa JSON formattata esistono tutti in una volta. Poche migliaia di righe è comodo; i conteggi delle righe a sei cifre faranno lottare la scheda. Per i file di grandi dimensioni, usa invece un parser in streaming in Node.
I miei dati sono stati caricati da qualche parte?
No. L'analisi avviene nel tuo browser e il tuo CSV non viene mai trasmesso, che è ciò che lo rende sicuro per le esportazioni dei clienti e altri dati che potresti' t legittimamente incollare in uno strumento lato server Verificalo nel modo più semplice: apri DevTools, guarda la scheda Rete durante la conversione o semplicemente disattiva il tuo Wi-Fi e vedi che funziona ancora.
la versione breve
Csv a JSON sembra la conversione più noiosa nel calcolo e non lo è, perché nel momento in cui un parser decide quali sono le tue corde significare, può essere sbagliato in modi che non si annunciano. Nessun errore, nessun avviso, solo codici postali a quattro cifre che emergono due giorni dopo.
Quindi: converti, quindi Leggi l'output. Controlla le colonne che sono identificatori che fingono di essere numeri. Se sono usciti senza virgolette, hai perso qualcosa. Quell'abitudine costa dieci secondi e mi avrebbe risparmiato un'e-mail imbarazzante.
la Convertitore da CSV a JSON è bravo nel lavoro una tantum - campi quotati, newline incorporate, ID big-integer e guasti forti su intestazioni duplicate, il tutto senza che i tuoi dati lascino il browser It' s solo virgola, deduce sempre i tipi e produce oggetti piatti Ora li conosci tutti e tre prima che mordano.
Andando nella direzione opposta: JSON a CSV. Per aver ispezionato prima un CSV disordinato: Visualizzatore CSV. Per controllare l'output: Formattatore JSON. E se la direzione dei tuoi dati per un file di configurazione, JSON a Yaml. Il tour più ampio è nel Guida agli strumenti JSON E il Guida agli strumenti di codifica.



