Elaborare dati CSV con csvq
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'