Elaborare dati CSV con csvq

Posted on May 18, 2021

Csvq è un’applicazione da linea di comando sviluppata in Go che permette in effettuare delle query SQL su file csv. Supporta sia operazioni di lettura, che di eliminazione e modifica.

L’ho utilizzata pochi giorni fa per estrarre alcuni dati di interesse sui comuni italiani dai file messi a disposizione dall’ISTAT.

In questo articolo descrivo, a titolo di esempio, alcune note sulle operazioni fatte.

Dati di partenza: https://www.istat.it/storage/codici-unita-amministrative/Elenco-comuni-italiani.csv

Da questi dati ho estratto:

un file csv per i dati delle regioni italiane, organizzato come id-regione,nome

csvq -T -f CSV -o regions.csv -d ';' --no-header 'select distinct c1,c11 from `comuni.csv`'

un file csv contenente solo le province organizzato come id-provincia,id-regione,nome

csvq -T -f CSV -o provinces.csv -d ';' --no-header 'select distinct c3,c1,c12 from `comuni.csv`'

un altro file csv contenente i comuni organizzato come id-regione,id-provincia,id-comune,nome

csvq -T -f CSV -o cities.csv -d ';' --no-header 'select distinct c1,c3,c5,c7 from `comuni.csv`'

In particolare per poter utilizzare il riferimento alla posizione alle colonne del csv di partenza (c1, c2, etc per capirci) ho dovuto utilizzare l’opzione --no-header altrimenti avrei dovuto utilizzare il nome esteso della colonna, che come si può leggere nel file di partenza è piuttosto verboso. L’inconveniente di usare l’opzione --no-header è che la prima riga contenente i nomi delle colonne non viene saltata durante elaborazione, ma ho preferito mantenere la leggibilità dei comandi di estrazione.

UPDATE 25/05/2021: Grazie ad una discussione sul repository del progetto, ho capito come semplificare il problema sopra descritto. Per utilizzare il riferimento alla posizione delle colonne senza ricorrere a sproposito all’opzione –no-header si deve dare un nome alla tabella. Qui di seguito ho rivisto uno degli esempi descritti con i miglioramenti suggeriti

csvq -T -f CSV -o cities.csv -d ';' 'select distinct t.1,t.3,t.5,t.7 from `comuni.csv` t'

E' possibile inoltre dare un nome più espressivo alla colonna del file risultato grazie ad as

csvq -T -f CSV -o cities.csv -d ';' 'select distinct t.1 as `Colonna 1`,t.3,t.5,t.7 from `comuni.csv` t'