Punto e virgola, tab, barra verticale: scegliere un delimitatore che sopravviva al viaggio
Pubblicato il 27/07/2026 · 16 min di lettura · Strumenti per sviluppatori
Daniel Okonkwo — Sviluppatore front-end e redattore Tech presso Allin
Performance web · Formati di file
Verificato su 4 fonti
Il delimitatore non è questione di gusto: lo decide il separatore decimale di chi apre il file. Nelle convenzioni francese, tedesca, spagnola, italiana e portoghese la virgola è il segno decimale, quindi lo stesso carattere non può anche separare i campi senza citare ogni numero. Quei sistemi usano il punto e virgola, e un foglio di calcolo così configurato apre un file separato da virgole come un'unica colonna di testo. Passa un vero export a punto e virgola — Produit;Prix;Remise;Ville con valori come 12,50 e 5,0% e una città citata Lyon, Rhône — nel convertitore di delimitatore e la differenza si conta. Scritto con punti e virgola, tabulazioni o barre verticali, il file non richiede alcuna cella citata. Scritto con virgole, ne richiede cinque: ogni numero decimale e ogni percentuale va avvolto perché la virgola interna non sia letta come confine. Scritto con spazi, una cella viene citata e il file diventa illeggibile per tutto ciò che spezza sugli spazi bianchi. Il tab è il più sicuro delle tre alternative, perché nessun formato numerico e quasi nessun indirizzo ne contiene uno, ma non sopravvive al copia e incolla: un tab digitato in un campo del browser sposta il fuoco, e molti editor lo trasformano in spazi. La barra verticale è ugualmente sicura e ugualmente non standard: nessun foglio di calcolo la apre senza una finestra di importazione. Excel onora inoltre una prima riga sep=; come istruzione, convenzione di fornitore assente dalla RFC 4180. Il convertitore riscrive correttamente quella riga quando cambia delimitatore, trasformando sep=; in sep=, — mentre un convertitore che non conosce la convenzione la leggerà come la tua riga di intestazione.
Perché la lingua di chi legge decide il delimitatore, che cosa fa il convertitore alle virgolette quando cambi, che cos'è davvero la prima riga sep=, e il conteggio delle celle citate sullo stesso export scritto in cinque modi.
Un carattere non può fare due mestieri
Tutto l'argomento si riduce a una collisione. Un file CSV ha bisogno di un carattere per segnare il confine fra i campi. Un numero scritto ha bisogno di un carattere per segnare il confine fra la parte intera e la frazione. Nelle convenzioni anglofone sono la virgola e il punto, e non c'è conflitto. Nelle convenzioni francese, tedesca, spagnola, italiana e portoghese il segno decimale è la virgola, e il conflitto è totale: il carattere che separa dodici da cinquanta dentro un prezzo è lo stesso che separerebbe il prezzo dalla colonna successiva.
Da una collisione così ci sono solo due vie d'uscita, e l'industria ha preso la seconda. La prima è tenere la virgola come separatore di campo e citare ogni valore che ne contiene una, il che è lecito e il formato lo prevede esplicitamente. La seconda è cambiare separatore. I sistemi operativi di quelle regioni portano un'impostazione di separatore di elenco accanto al separatore decimale, ed è impostata sul punto e virgola proprio perché i due non si incontrino mai; i fogli di calcolo la leggono quando salvano e aprono un CSV. Il risultato è che un file esportato da un collega a Lione e uno esportato da un collega a Chicago sono formati diversi con la stessa estensione, e ciascuno si apre come una colonna di testo sulla macchina dell'altro.
Lo stesso export, cinque scritture, contato
Ecco un piccolo export francese, quattro colonne: Produit, Prix, Remise, Ville. Due righe: Café a 12,50 con il 5,0% di sconto a Lyon, Rhône, e Thé a 8,90 con 0,0% a Paris. Contiene tutto ciò che rende reale questa domanda: virgole decimali, una percentuale scritta con la virgola, e un nome di città che contiene legittimamente una virgola e uno spazio.
Passalo cinque volte nel convertitore di delimitatore e conta le celle che tornano fra virgolette. Con punti e virgola, tabulazioni o barre verticali: zero. Nemmeno una cella del file va protetta, perché nessun valore contiene uno di quei tre caratteri. Con le virgole: cinque. Il prezzo del Café, il suo sconto, la sua città, il prezzo del Thé e il suo sconto vanno tutti citati, e il file passa da pulito a ingombro. Con gli spazi: una cella citata, la città, e il resto del file diventa una trappola per tutto ciò che tratta una sequenza di spazi come un solo confine.
Guarda che cosa fa il convertitore alle virgolette, perché è qui che gli script fatti in casa sbagliano. Passando da punto e virgola a virgole, aggiunge le virgolette attorno a 12,50 e a 5,0% — valori perfettamente sicuri prima e non più. Passando da virgole a punto e virgola, toglie le virgolette attorno a Lyon, Rhône, perché una virgola dentro un campo non è più un confine e la protezione è ormai rumore. Uno script che scambia i caratteri con un cerca e sostituisci non fa né l'una né l'altra cosa: riscrive la virgola di Lyon, Rhône in punto e virgola, spezzando la città in due, e lascia 12,50 senza virgolette, così il lettore successivo trova una colonna in più. Analizzare e riemettere è l'unica implementazione corretta, e il segno visibile che uno strumento lo fa è che le virgolette cambiano quando cambia il delimitatore.
Il tab: il più sicuro sulla carta, fragile in transito
L'argomento a favore del tab è che nessun formato numerico ne contiene uno, in nessuna localizzazione. Nemmeno un indirizzo postale, un nome di prodotto o un nome di persona d'uso comune, quindi un file separato da tabulazioni con dati aziendali veri di solito non richiede alcuna virgoletta — è esattamente ciò che il conteggio in cinque scritture qui sopra ha mostrato. È inoltre il formato che il foglio di calcolo stesso deposita negli appunti: copia un blocco di celle e ciò che vi atterra come testo semplice è separato da tabulazioni, ed è per questo che incollare una selezione in un editor di testo ti consegna un TSV già pronto. Gli strumenti da riga di comando vanno nella stessa direzione, cut in testa: spezza sul tab se non gli si dice altro. Sui meriti del carattere, vince.
Perde sul trasporto. Un tab è un carattere di controllo con un compito in ogni interfaccia di immissione testo che attraversa, e quel compito non è essere un dato. Digitato in un campo del browser sposta il fuoco al controllo successivo. Incollato in un messaggio di chat o in un tracker di ticket viene spesso reso come una sequenza di spazi e talvolta convertito in essi. Molti editor sono configurati per espandere un tab digitato in spazi, quindi chi apre il file per correggere una cella può distruggere la struttura di ogni riga che tocca senza vedere nulla cambiare a schermo. E poiché un tab sembra un tratto vuoto, un tab diventato spazi resta invisibile finché un parser non ti dice che la riga ha un solo campo.
Vale la pena conoscere un dettaglio su come questo convertitore scrive l'output separato da tabulazioni, perché sorprende chi si aspetta un TSV grezzo. Applica le regole di virgolettatura del CSV al formato a tabulazioni: una cella che contiene un tab, un a capo o una virgoletta doppia viene avvolta fra virgolette e le sue virgolette interne raddoppiate. Così una cella con say "hi" esce come "say ""hi""" benché non contenga alcun tab. I fogli di calcolo lo leggono correttamente. Gli strumenti che spezzano ogni riga sul tab e prendono i pezzi alla lettera no: vedono le virgolette come parte del valore. Se il tuo consumatore è un semplice separatore di campi e non un lettore CSV, verifica che cosa fa con una cella citata prima di affidarti al file.
La riga sep=, e ciò che questo convertitore azzecca per caso
Excel accetta una prima riga nella forma sep=; e la legge come un'istruzione: il carattere dopo il segno di uguale è il separatore di campo di questo file, qualunque cosa dica l'impostazione di separatore di elenco della macchina. È l'unico meccanismo d'uso corrente che permetta a un file CSV di dichiarare il proprio delimitatore, e non fa parte né della RFC 4180 né della registrazione del tipo di media text/csv: è una convenzione di fornitore diffusasi perché risolve un problema reale al prezzo di una riga.
È qui che sta l'inghippo. Nulla a cui la convenzione non sia stata insegnata la riconoscerà, e il file non ha modo di segnalare che quella riga è metadato e non dato. Un lettore CSV generico la tratta come il primo record, e se il lettore usa anche la prima riga come intestazione, i tuoi nomi di colonna diventano sep= e una serie di segnaposti posizionali, mentre la tua vera intestazione scivola nei dati. È esattamente ciò che accade se dai un file del genere a un convertitore da CSV a JSON senza togliere prima la riga.
Il convertitore di delimitatore la gestisce correttamente, e la ragione merita di essere raccontata perché nessuno l'ha progettata. Lo strumento non ha mai sentito parlare della convenzione: analizza sep=; come un record ordinario, il che con il punto e virgola come delimitatore dà due celle — sep= e una vuota — e poi riscrive quel record con il nuovo delimitatore. Convertire in virgole produce sep=, convertire in tabulazioni produce sep= seguito da un tab, e convertire in barre produce sep=|. In ogni direzione il suggerimento resta vero per il file che etichetta. Lo stesso caso aiuta il rilevamento: la riga di suggerimento contiene esattamente un'occorrenza del carattere che nomina e nessuna degli altri tre candidati, e vengono presi in considerazione solo i caratteri visti sul primo record — quindi un file che porta il suggerimento offre un solo candidato, proprio quello che la riga nomina.
Il rilevamento automatico pesa cinque record, e la costanza batte la frequenza
Il rilevamento qui conta virgola, punto e virgola, tab e barra verticale, saltando ciò che sta tra virgolette, e lo fa record per record: cinque al massimo, mai l'intero file. Un candidato il cui conteggio si ripete identico su ogni record letto riceve un grosso bonus, quindi la costanza pesa più della semplice frequenza sulla riga di intestazione. Dagli un'intestazione a,b,c|d sopra le righe 1|2 e 3|4 e la risposta è la barra verticale, benché quell'intestazione porti due virgole contro una sola barra: il conteggio delle barre si ripete su ogni record, mentre quello delle virgole crolla a zero già dal secondo. La costanza è il segnale migliore, perché un vero confine di colonna compare lo stesso numero di volte in ogni riga di un file ben formato, mentre un carattere che si trova per caso in un titolo compare dove capita.
Due limiti sopravvivono a quella regola, ed è bene conoscerli entrambi prima di lasciare l'impostazione su automatico. Il primo: sono candidati solo i caratteri che compaiono sul primo record. Un'intestazione a,b sopra una riga 1;2;3;4 restituisce ancora la virgola, perché il punto e virgola non compare mai sulla riga che stila la lista — le righe sotto non possono promuovere un carattere che l'intestazione non ha mostrato. Il secondo: cinque record sono una finestra, non una prova. Dagli un'intestazione a,b,c|d sopra quattro righe della forma 1|2 e risponde barra verticale; aggiungi un sesto record 9|10|11, che rompe lo schema, e la risposta resta la barra, perché quel record non viene mai letto. Sposta la stessa riga al quinto posto e la risposta passa alla virgola. Il sintomo di una scelta sbagliata è lo stesso in entrambi i casi: le righe tornano come un'unica cella larga, con il separatore vero ancora dentro. Il rimedio è un clic: imposta esplicitamente il delimitatore di origine invece di lasciarlo su automatico. Un file senza alcun delimitatore ripiega sulla virgola, il che non cambia nulla ed è il default giusto.
Due ultime note pratiche. L'opzione spazio esiste nello strumento e non andrebbe quasi mai scelta: ogni campo che contiene uno spazio viene citato, il che in dati veri è la maggior parte, e nessun lettore tratta una sequenza di spazi come ti aspetti. E la conversione è reversibile in entrambe le direzioni su input ben formato: prendi un file a virgole la cui città è citata come Paris, France, convertilo in punti e virgola e torna indietro, e ottieni il file originale carattere per carattere, perché le virgolette vengono ricalcolate a ogni passaggio invece di essere trascinate.
| Delimitatore | Celle citate necessarie | Dove funziona | Dove si rompe |
|---|---|---|---|
| Virgola | 5 celle su 12 | Il default degli strumenti in locale inglese e della registrazione del tipo di media | Un foglio di calcolo il cui separatore di elenco è il punto e virgola apre l'intero file in una colonna |
| Punto e virgola | 0 celle su 12 | Qualsiasi macchina il cui segno decimale sia la virgola — convenzioni francese, tedesca, spagnola, italiana, portoghese | Un foglio di calcolo in locale inglese, e ogni importatore che assuma la virgola senza chiedere |
| Tab | 0 celle su 12 | File passati da macchina a macchina; nessun formato numerico né indirizzo contiene un tab | Il copia e incolla: un tab sposta il fuoco in un modulo e molti editor lo trasformano in spazi |
| Barra verticale | 0 celle su 12 | Visibile, sopravvive al copia e incolla, e non compare in quasi nessun dato naturale | Non standard: nessun foglio di calcolo lo apre senza finestra di importazione, e nessun tipo di media lo nomina |
| Spazio | 1 cella su 12, e molte di più su dati veri | Nulla che un delimitatore migliore non faccia | Ogni campo con uno spazio, cioè quasi tutti i nomi, indirizzi e descrizioni |
Domande frequenti
- Il mio collega apre il mio CSV e tutto è nella colonna A. Che cosa gli mando invece?
- La sua macchina si aspetta un separatore di campo diverso da quello che hai usato, e nove volte su dieci significa che hai mandato virgole a qualcuno il cui separatore di elenco è il punto e virgola. Converti il file in punti e virgola e rimandalo. Se non sai di quale abbia bisogno, o se il file va a più persone insieme, ci sono due opzioni robuste: aggiungere una prima riga sep= seguita dal tuo delimitatore, che Excel onora e che rende il file autodescrittivo, oppure mandare un vero file di foglio di calcolo invece di un CSV, dato che quel formato registra la propria struttura e non ha separatore da indovinare. Attenzione: la riga sep= aiuta solo un lettore che conosca la convenzione — uno script che legge il file la prenderà per la tua riga di intestazione.
- Un file separato da virgole con numeri citati è comunque corretto?
- Sì, del tutto. Citare un campo che contiene il delimitatore è esattamente lo scopo del meccanismo, e un file citato correttamente si analizza bene ovunque. Le obiezioni sono pratiche e non formali. È molto più difficile da leggere a occhio, quindi chi scorre il file in cerca di un errore deve farsi strada fra le virgolette. È più grande, di due caratteri per valore citato più una virgoletta raddoppiata per ogni virgoletta interna. Ed è fragile nelle mani di chi lo modificherà dopo: chi apre il file in un editor e toglie quella che sembra una virgoletta vagante attorno a un prezzo ha appena corrotto ogni riga sotto il punto in cui le colonne si sono spostate. Scegliere un delimitatore che non compare nei dati elimina del tutto il bisogno di virgolette, e un file che non ha mai bisogno di virgolette non può essere rotto da chi lo riordina.
- Tab o barra verticale quando controllo entrambe le estremità?
- Tab, se il file si muove solo fra programmi, e barra verticale se un umano lo guarderà o lo sposterà. Entrambi sono ugualmente sicuri rispetto ai dati — nessuno dei due compare in un numero, un indirizzo o un nome d'uso comune — quindi la differenza è tutta di maneggevolezza. Il tab vince sugli strumenti: fogli di calcolo e utilità da riga di comando aprono un file separato da tabulazioni senza finestra di importazione. La barra vince su visibilità e sopravvivenza: si vede in un terminale, è inequivocabile in uno screenshot, e attraversa senza danno un messaggio di chat, un campo di modulo e un editor di testo, cosa che per il tab non vale in nessuno dei tre casi. Se il file sarà incollato da qualche parte a un certo punto della sua vita, scegli la barra.
- Perché il convertitore aggiunge le virgolette quando passo da punti e virgola a virgole?
- Perché quelle celle contengono una virgola e la virgola è appena diventata un confine. Un prezzo scritto 12,50 era un valore ordinario in un file a punto e virgola e sarebbe letto come due colonne in un file a virgole, quindi va avvolto. Lo stesso accade a una percentuale scritta 5,0% e a qualsiasi indirizzo che contenga una virgola. Non è prudenza del convertitore: è il minimo necessario perché il file continui a significare ciò che significava. L'operazione inversa toglie le virgolette per lo stesso motivo: riconverti in punti e virgola e le virgolette attorno a un valore il cui unico carattere speciale era una virgola spariscono, perché quel carattere non separa più nulla. Se preferisci non portarti dietro le virgolette, è proprio questo l'argomento per convertire in tabulazioni o barre verticali, dove nei dati non c'è nulla da proteggere.
- Il separatore decimale stesso viene convertito?
- No, e non dovrebbe esserlo. Il convertitore di delimitatore cambia la struttura del file e mai il contenuto di una cella: un prezzo scritto 12,50 resta 12,50 qualunque delimitatore tu scelga, e un prezzo scritto 12.50 resta 12.50. Convertire anche i numeri sarebbe un'operazione diversa e molto più pericolosa, perché richiederebbe di decidere, cella per cella, se una virgola è segno decimale o separatore delle migliaia — e 1,500 è uno e mezzo oppure millecinquecento a seconda della risposta. Se ti serve riformattare i numeri per un lettore di un'altra convenzione, fanne un passaggio separato e deliberato in cui vedi quali colonne sono coinvolte, e verifica un valore di cui conosci la risposta prima di accettare il risultato.
Articoli che potrebbero interessarti
Tutte le guide →Strumenti correlati
Questo descrive ciò che questi convertitori fanno oggi, verificato eseguendoli, e non ciò che una norma imponga a un convertitore. Il CSV non ha una norma prescrittiva: la RFC 4180 è informativa e descrive una prassi diffusa, perciò due strumenti apparentemente corretti possono divergere sullo stesso file senza che nessuno sbagli. L'appiattimento, il riconoscimento dei tipi e quello degli array sono convenzioni, non regole. Prima di convertire dati che non potrai riesportare, passa prima su una copia e confronta il numero di righe e colonne alle due estremità.
Fonti
- IETF — RFC 4180, Common Format and MIME Type for Comma-Separated Values (CSV) Files — the comma as the field separator, rule 6 on quoting a field that contains one, and the absence of any mechanism for a file to declare a different delimiter
- IANA — Media type registration for text/csv — the registered parameters are charset and header, and the definition points at RFC 4180: nothing in the registration allows a file to name its own separator
- Unicode — CLDR number symbols by locale — the decimal and grouping separators each language actually uses, including the comma as the decimal mark in French, German, Spanish, Italian and Portuguese
- W3C — Model for Tabular Data and Metadata on the Web — the separate metadata document this model uses to record the delimiter, the encoding and the column types that a bare CSV file cannot carry
Hai notato un errore in questo articolo?