In questo (Dove sono gli alberi monumentali d’Italia?) bel blog post, del maestro Andrea Borruso, si parla di alberi monumentali d’Italia, della genesi del dataset e dei problemi riscontrati per ottenere un output strutturato e facilmente leggibile: csv, geojson (vi consiglio la lettura).
L’output, di questo lungo lavoro certosino, è un file CSV con #19 campi e oltre #2000 record; tra i vari campi sono presenti le coordinate longitudine, latitudine (in EPSG 4326) che permettono di visualizzare – per esempio con QGIS – i pallini degli alberi monumentali d’Italia.

Mappa di sfondo: OpenStreetMap contributors
In questo blog post vedremo come effettuare delle correzione sui dati presenti in alcuni campi del CSV usando la riga di comando
Vediamo gli errori nel campo “CONTESTO URBANO sì/no”


“CONTESTO URBANO sì/no”
come si puo’ notare risultano 8 classi invece di due (sì, no): sono tipici errori di battitura, spazio a fine parola (si , no ); tutto maiuscolo (SI); prima lettera maiuscola e i non accentata (Si); ecc…;
Vediamo gli errori nel campo “PROVINCIA”


Legenda – “PROVINCIA” con errori
anche in questo caso alcune province sono scritte male: spazio a fine parola (Biella e Campobasso); trattino tra una parola e l’altra (Monza Brianza); lettere in più (Verbano Cusio Ossola): sono tipici errori di battitura.
Correggere questi errori usando le espressioni regolari e la riga di comando
nel primo caso occorre intercettare tutti i casi possibili relativi alla parola si e no, nel secondo caso occorre intercettare vari errori ma il più complesso è quello relativo agli spazi a fine stringa; questo script bash risolve gli errori descritti e genera un nuovo file CSV:
#!/bin/bash | |
sqlite3 nomeDb.db <<EOF | |
— per usare questo script occorre creare prima un db.db | |
— nel seguente modo: $ sqlite3 nomeDb.db | |
— si avvierà sqlite con db pronto all''uso | |
— | |
.mode csv alberiMonumentali | |
.import alberiMonumentali.csv alberiMonumentali | |
— legge modulo per il regex | |
.load /usr/lib/sqlite3/pcre.so | |
— correzione spazi iniziali e finali | |
— campo PROVINCIA | |
UPDATE "alberiMonumentali" SET "PROVINCIA" = TRIM("PROVINCIA"); | |
— campo COMUNE | |
UPDATE "alberiMonumentali" SET "COMUNE" = TRIM("COMUNE"); | |
— campo LOCALITÀ | |
UPDATE "alberiMonumentali" SET "LOCALITÀ" = TRIM("LOCALITÀ"); | |
— campo PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO | |
UPDATE "alberiMonumentali" SET "PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO" = | |
TRIM("PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO"); | |
— correzione campo CONTESTO_URBANO sì/no | |
UPDATE "alberiMonumentali" SET "CONTESTO URBANO sì/no" = 'sì' | |
WHERE "CONTESTO URBANO sì/no" regexp '.*[sS].*'; | |
UPDATE "alberiMonumentali" SET "CONTESTO URBANO sì/no" = 'no' | |
WHERE "CONTESTO URBANO sì/no" regexp '.*[nN].*'; | |
— correzione campo PROVINCIA | |
UPDATE "alberiMonumentali" SET "PROVINCIA" = 'Verbano Cusio Ossola' | |
WHERE "PROVINCIA" regexp 'Verbano Cusio.*'; | |
UPDATE "alberiMonumentali" SET "PROVINCIA" = 'Monza Brianza' | |
WHERE "PROVINCIA" regexp 'Monza.*'; | |
— correzione campo PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO | |
UPDATE "alberiMonumentali" SET "PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO" = 'sì' | |
WHERE "PROPOSTA DICHIARAZIONE NOTEVOLE INTERESSE PUBBLICO" = 'si'; | |
— esporto in csv | |
.headers on | |
.mode csv | |
.output alberiMonumentali_v01.csv | |
SELECT * FROM alberiMonumentali; | |
.quit | |
EOF | |
rm ./nomeDb.db |
Lo script bash: crea un database SQLite e importa il file CSV; tramite le query di aggiornamento (UPDATE) e le funzione trim e regexp, trova e sostituisce i valori errati; infine, esporta i dati corretti in un nuovo file CSV.
ecco la legenda dopo la correzione – primo caso:

ecco la legenda dopo la correzione – secondo caso:

Alcuni riferimenti:
- Blog post di Andrea Dove sono gli alberi monumentali d’Italia?
- Repository Ondata – per i dati e script
- Regex101 – per provare le espressioni regolari
- Piccola guida alle espressioni regolari
- QGIS.org per scaricare il software libero e Open Source e visualizzazione dataset
- SQLite e la funzione regexp
- SQLite funzione trim
- SQLite esportare in CSV
- Bash Ubuntu per Windows 10
Per chi volesse provare: CSV
Ringraziamenti
Il gruppo Telegram HfcQGIS in RTD by ODS e Andrea Borruso
Buon lavoro!!!