Il CSV è il formato di scambio più diffuso per i dati tabellari: lo esportano i gestionali, le banche, i siti di e-commerce, i fogli di calcolo. È semplice, leggibile con qualunque editor di testo e accettato da qualunque database. Proprio la sua semplicità, però, lascia spazio a molte varianti e ambiguità. Un file che sembra perfetto può nascondere errori che si scoprono solo dopo l'importazione, quando i dati sono già finiti nei report.
Il separatore: virgola, punto e virgola o tabulazione
CSV significa comma-separated values, valori separati da virgola. Nei paesi in cui la virgola è il separatore decimale, come l'Italia, molti programmi usano invece il punto e virgola, per evitare che 12,50 venga diviso in due colonne. Lo stesso foglio di calcolo esportato su due computer con impostazioni regionali diverse può quindi produrre due file diversi.
Prima di importare, conviene aprire il file con un editor di testo e guardare le prime righe. Il separatore si riconosce a colpo d'occhio. Gli strumenti di importazione seri permettono sempre di indicarlo esplicitamente, ed è meglio farlo che affidarsi al riconoscimento automatico.
Virgolette e campi che contengono il separatore
Un campo che contiene il separatore, un a capo o delle virgolette deve essere racchiuso tra virgolette doppie, e le virgolette interne vanno raddoppiate:
codice;descrizione;prezzo
A12;"Cavo USB; lunghezza 2 m";8,90
B07;"Monitor 24"" Full HD";149,00
È la convenzione descritta dalla RFC 4180, il documento di riferimento più citato per il formato. Molti programmi che generano CSV la rispettano solo in parte. Un file con un numero di colonne che varia da riga a riga quasi sempre indica un campo con il separatore al suo interno non racchiuso correttamente.
Un controllo rapido in Python:
import csv
from collections import Counter
with open("articoli.csv", encoding="utf-8", newline="") as f:
conteggi = Counter(len(riga) for riga in csv.reader(f, delimiter=";"))
print(conteggi) # idealmente un solo valore
La codifica dei caratteri
Le lettere accentate sono la prima vittima. Se in un file compaiono sequenze come «città » al posto di «città», il file è codificato in UTF-8 ma viene letto come se fosse in una codifica occidentale come Windows-1252. Il caso inverso produce caratteri sostitutivi o errori di lettura.
Regole pratiche:
- chiedere e produrre sempre file in UTF-8;
- se un file non si legge in UTF-8, provare Windows-1252 o ISO-8859-1, che sono comuni nei vecchi gestionali europei;
- attenzione al BOM, una sequenza invisibile all'inizio di alcuni file UTF-8: può finire attaccata al nome della prima colonna, che diventa diverso da quello atteso. In Python la codifica
utf-8-sigla rimuove automaticamente.
Zeri iniziali e numeri lunghi
Aprire un CSV con doppio clic in un foglio di calcolo è il modo più rapido per rovinarlo. Il programma interpreta i valori e, salvando, scrive l'interpretazione:
- il CAP
00184diventa184; - un codice di 16 cifre o un numero di carta può essere mostrato in notazione scientifica e perdere le ultime cifre;
- un codice prodotto come
3-4oMAR1può essere trasformato in una data.
I codici non sono numeri, anche se sono fatti di cifre: non si sommano e non si confrontano come quantità. In fase di importazione vanno sempre letti come testo. Con pandas:
import pandas as pd
df = pd.read_csv("clienti.csv", sep=";", dtype={"cap": str, "codice_cliente": str})
Se il file deve essere consultato in un foglio di calcolo, è meglio usare la funzione di importazione guidata, impostando come testo le colonne di codici.
Numeri con separatori locali
1.250,50 in formato italiano corrisponde a 1,250.50 in formato inglese. Un importatore che si aspetta il punto decimale leggerà il primo come testo o, peggio, come un numero sbagliato. Pandas accetta i parametri decimal="," e thousands="." per gestire il formato italiano.
Date ambigue
03/04/2025 è il 3 aprile in Italia e il 4 marzo negli Stati Uniti. Se nel file tutti i giorni sono minori o uguali a 12, non c'è modo di capirlo dal contenuto. Va chiesto a chi ha prodotto il file, oppure verificato su un record noto. Il formato ISO 2025-04-03 elimina l'ambiguità ed è quello da preferire per qualunque file prodotto in proprio.
Spazi, righe vuote e valori «finti»
Altri difetti frequenti:
- spazi prima o dopo i valori, che rendono diversi
"Rossi"e"Rossi "; - righe vuote o righe di totale in fondo al file;
- intestazioni ripetute a metà file, quando il CSV è stato unito da più esportazioni;
- valori convenzionali per indicare l'assenza, come
N/D,-,0o1900-01-01, da convertire in valori vuoti veri.
Un metodo in cinque passi
- Aprire il file in un editor di testo e controllare separatore, codifica e intestazione.
- Contare le colonne per ogni riga e isolare quelle anomale.
- Importare tutto come testo in una tabella di appoggio.
- Convertire tipi, date e numeri con query o script, registrando le righe che non si convertono.
- Confrontare conteggi e totali con il sistema di origine prima di passare i dati alle tabelle definitive.
In sintesi
- Il separatore cambia con le impostazioni regionali: va verificato e indicato esplicitamente.
- I campi con separatori o a capo devono essere tra virgolette; colonne variabili indicano un errore.
- Lettere accentate rovinate indicano una codifica sbagliata; il BOM può alterare la prima colonna.
- Codici, CAP e numeri lunghi vanno letti come testo; le date vanno chiarite o scritte in formato ISO.
- Conviene importare in una tabella di appoggio e convertire in un secondo momento.