Domare il Caos delle Tabelle Direttamente dal Terminale
Se ricevi regolarmente esportazioni di dati, probabilmente conosci il problema. Un file di trecento megabyte, codifica Windows-1251, il delimitatore è un punto e virgola in alcuni punti e una virgola in altri, e ci sono interruzioni di riga non precedute da escape all'interno delle righe. Aprirlo in Excel è un modo sicuro per far congelare completamente la suite office o per eliminare accidentalmente gli zeri iniziali dai numeri di telefono. Scrivere un rapido script Python con pandas solo per fare un controllo è anche una seccatura.
In queste situazioni, csvkit viene in soccorso — un insieme di utility da riga di comando per lavorare con dati tabulari. Il progetto è su GitHub dal 2011, ha raccolto oltre 6400 stelle, e rimane ancora uno dei modi più convenienti per sezionare i CSV direttamente in bash.
Cosa può fare questo insieme di utility
I creatori del pacchetto, il giornale Wire Services, sono stati ispirati da strumenti come pdftk e GDAL. L'idea è semplice: dare agli sviluppatori e agli analisti di dati un insieme di comandi specializzati per le pipeline UNIX per pulire, tagliare, formattare ed esplorare file tabulari senza scrivere codice.
Le utility sono suddivise per compito: conversione, taglio, analisi ed esecuzione di query SQL.
Anteprima rapida e statistiche di base
Il comando csvlook trasforma un CSV grezzo in una elegante tabella ASCII con l'allineamento corretto delle colonne. Combinato con head o less, ottieni un'ottima anteprima:
head -n 20 data.csv | csvlook
Se hai bisogno di capire la struttura di un file sconosciuto, esegui csvstat. L'utility analizza i tipi di dati in ogni colonna, trova i valori mancanti, calcola minimo, massimo, media e mostra un elenco dei valori più frequenti:
csvstat data.csv
Taglio e filtraggio
Le utility UNIX tradizionali come cut e grep spesso falliscono sui CSV complessi quando virgole o interruzioni di riga appaiono all'interno di campi tra virgolette. Il pacchetto ha alternative specializzate:
csvcut taglia le colonne necessarie per nome o numero:
csvcut -c "user_id,email,status" users.csv > clean_users.csv
csvgrep filtra le righe per valori o espressioni regolari:
csvgrep -c "status" -m "active" users.csv
SQL direttamente sui file
Uno dei comandi più convenienti è csvsql. Può fare due cose. Prima, genera uno schema DDL per PostgreSQL, MySQL o SQLite analizzando i tipi di dati nel file. Seconda, ti permette di scrivere query SQL direttamente contro i file CSV su disco tramite SQLite integrato:
csvsql --query "select status, count(*) from users group by status" users.csv
Puoi anche unire due file diversi come se fossero tabelle di database normali:
csvsql --query "select u.name, o.total from users u join orders o on u.id = o.user_id" users.csv orders.csv
Conversione di formati
Lo strumento in2csv converte praticamente qualsiasi cosa in CSV: file Excel (.xls e .xlsx), JSON, NDJSON e larghezza fissa. Non c'è bisogno di lanciare Excel solo per salvare nuovamente un report ricevuto:
in2csv report.xlsx --sheet "Sales" > sales.csv
Come funziona sotto il cofano
Il pacchetto è scritto in Python e distribuito tramite PyPI. Usa SQLAlchemy per le operazioni di database, il che spiega la flessibilità di csvsql quando si lavora con diversi dialetti SQL.
Il vantaggio principale dell'architettura è la compatibilità con l'input e l'output standard (stdin/stdout). I comandi sono facilmente concatenati attraverso una pipe normale:
in2csv data.xlsx | csvgrep -c "country" -m "RU" | csvcut -c 1,3,5 | csvlook
Questo approccio ha però uno svantaggio. Poiché la libreria è scritta in Python puro con controllo dei tipi a runtime, le prestazioni calano sui file di più gigabyte. Per esportazioni su scala di terabyte, è meglio usare xsv in Rust o duckdb, ma per attività quotidiane fino a qualche centinaio di megabyte, la velocità di csvkit è più che sufficiente.
Dove torna utile nella pratica
- Controllare la struttura dei dati su un server remoto senza GUI.
- Pre-pulire i file in script bash prima di caricarli in una pipeline ETL.
- Generare schemi di tabelle di database per una nuova esportazione (
csvsql -i postgresql data.csv). - Unire rapidamente due file disparati per una chiave comune tramite
csvjoin.
Vale la pena installarlo
Il pacchetto si installa con un singolo comando pip:
pip install csvkit
Se analizzi spesso log, lavori con importazioni di database o ricevi report come archivi con Excel e CSV, questo insieme di utility ti farà risparmiare molti nervi. Elimina la necessità di aprire un editor pesante o scrivere script monouso per il filtraggio base di due colonne. Inizia con csvlook e in2csv — ripagano l'installazione nei primi cinque minuti di utilizzo.
Progetti correlati