alltools.one
Data
2025-07-01
8 min
alltools.one Team
CSVData CleaningData AnalysisETLPython

Consigli per la Pulizia dei Dati CSV per Analisti e Sviluppatori

I file CSV sono il formato di scambio universale per i dati tabulari. Sono semplici, leggibili dall'uomo e supportati da ogni strumento, da Excel a pandas. Ma i file CSV del mondo reale sono spesso disordinati — codifiche incoerenti, valori mancanti, tipi di dati misti e righe malformate. Questa guida copre tecniche pratiche per pulire i dati CSV in modo affidabile.

Problemi Comuni dei CSV

1. Problemi di Codifica

Il problema CSV più frustrante è la codifica. Un file creato su Windows in Excel potrebbe usare windows-1252, mentre il tuo script Python si aspetta utf-8.

Sintomi: Caratteri illeggibili (mojibake) come é invece di é, o eccezioni UnicodeDecodeError.

Rilevamento:

import chardet

with open('data.csv', 'rb') as f:
    result = chardet.detect(f.read(10000))
    print(result)  # {'encoding': 'Windows-1252', 'confidence': 0.73}

Correzione: Leggi con la codifica rilevata, poi salva come UTF-8:

import pandas as pd

df = pd.read_csv('data.csv', encoding='windows-1252')
df.to_csv('data_clean.csv', encoding='utf-8', index=False)

2. Delimitatori Incoerenti

Non tutti i "CSV" usano virgole. I file CSV europei spesso usano punti e virgola perché le virgole sono separatori decimali in molte lingue europee.

# Rilevamento automatico del delimitatore
import csv

with open('data.csv', 'r') as f:
    dialect = csv.Sniffer().sniff(f.read(5000))
    print(f"Delimitatore: {repr(dialect.delimiter)}")

Il nostro Editor CSV gestisce automaticamente il rilevamento del delimitatore — incolla i tuoi dati e identifica il formato.

3. Valori Mancanti

I dati mancanti appaiono in molte forme: celle vuote, NA, N/A, null, -, o solo spazi.

# Standardizza tutte le rappresentazioni dei valori mancanti
df = pd.read_csv('data.csv', na_values=['NA', 'N/A', 'null', '-', '', ' '])

# Controlla i valori mancanti per colonna
print(df.isnull().sum())

# Strategia 1: Elimina righe con campi critici mancanti
df = df.dropna(subset=['email', 'name'])

# Strategia 2: Riempi con valori predefiniti
df['country'] = df['country'].fillna('Unknown')

# Strategia 3: Forward fill (serie temporali)
df['price'] = df['price'].ffill()

4. Righe Duplicate

I duplicati esatti sono facili da trovare. I duplicati approssimativi (stessa persona con ortografia del nome leggermente diversa) sono più difficili.

# Trova duplicati esatti
duplicates = df[df.duplicated(keep=False)]
print(f"Trovate {len(duplicates)} righe duplicate")

# Rimuovi duplicati, mantieni la prima occorrenza
df = df.drop_duplicates()

# Rimuovi duplicati in base a colonne specifiche
df = df.drop_duplicates(subset=['email'], keep='last')

5. Formati Dati Incoerenti

Date in formati misti, numeri di telefono con e senza prefisso internazionale, maiuscole incoerenti:

# Standardizza le date
df['date'] = pd.to_datetime(df['date'], format='mixed', dayfirst=False)

# Standardizza i campi di testo
df['name'] = df['name'].str.strip().str.title()
df['email'] = df['email'].str.strip().str.lower()

# Standardizza i numeri di telefono (base)
df['phone'] = df['phone'].str.replace(r'[^0-9+]', '', regex=True)

6. Problemi di Tipo di Dato

Il CSV memorizza tutto come testo. Numeri con zeri iniziali, codici postali e numeri di telefono possono perdere la formattazione durante il parsing:

# Preserva gli zeri iniziali nei codici postali
df = pd.read_csv('data.csv', dtype={'zip_code': str, 'phone': str})

# Converti stringhe di valuta in numeri
df['price'] = df['price'].str.replace('$', '').str.replace(',', '').astype(float)

Validazione Dopo la Pulizia

Valida sempre i tuoi dati puliti:

# Controlla il conteggio delle righe (abbiamo perso o guadagnato righe inaspettatamente?)
print(f"Righe: {len(df)}")

# Controlla i tipi di dati
print(df.dtypes)

# Controlla gli intervalli di valori
print(df.describe())

# Controlla i null rimanenti
print(df.isnull().sum())

# Valida i vincoli di unicità
assert df['email'].is_unique, "Email duplicate trovate!"

Strumenti da Riga di Comando

Per pulizia rapida senza scrivere codice:

# Converti codifica
iconv -f WINDOWS-1252 -t UTF-8 input.csv > output.csv

# Ordina e rimuovi righe duplicate
sort -u input.csv > output.csv

# Estrai colonne specifiche (cut)
cut -d',' -f1,3,5 input.csv > output.csv

# Filtra righe (awk)
awk -F',' '$3 > 100' input.csv > filtered.csv

Per trasformazioni più complesse, strumenti come csvkit forniscono una suite completa di utilità CSV:

# Installa
pip install csvkit

# Visualizza nomi delle colonne
csvcut -n data.csv

# Filtra righe
csvgrep -c country -m "USA" data.csv > usa_only.csv

# Converti in JSON
csvjson data.csv > data.json

Conversione tra CSV e JSON? Il nostro convertitore CSV in JSON lo gestisce istantaneamente.

FAQ

Qual è la dimensione massima del file per l'elaborazione CSV?

Non c'è un limite intrinseco nel formato CSV. Il limite pratico dipende dai tuoi strumenti: Excel gestisce circa 1 milione di righe, pandas funziona bene fino a diversi GB con RAM adeguata, e strumenti come Dask o Polars gestiscono dataset più grandi della memoria. Per gli strumenti basati su browser, il nostro editor CSV gestisce file fino a 100MB.

Dovrei usare CSV o JSON per lo scambio dati?

Il CSV è migliore per dati tabulari piatti (fogli di calcolo, esportazioni database, liste semplici). JSON è migliore per dati annidati e gerarchici (risposte API, configurazione, documenti con struttura variabile). Per un confronto dettagliato, consulta la nostra guida CSV vs JSON vs XML.

Risorse Correlate

Published on 2025-07-01
CSV Data Cleaning Tips for Analysts and Developers | alltools.one