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 selezioni e correzione sui dati presenti in alcuni campi del CSV
Vediamo gli errori nel campo “CONTESTO URBANO sì/no”


“CONTESTO URBANO sì/no”
come si puo’ notare risultano 8 classi invece di due (si, no): sono tipici errori di battitura, spazio a fine parola (si , no ); tutto maiuscolo (SI); prima lettera maiuscola e ì 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.
Come correggere questi errori usando il calcolatore di campi di QGIS e le espressioni regolari
nel primo caso occorre intercettare tutti i casi possibili relativi alla parola si e no, la ricetta che risolve il problema è la seguente:
.+[sS].+ per il sì;
.+[nN].+ per il no;
dove:
usando il calcolatore di campi ed aggiornando il campo stesso:
espressione usata:
IF(
regexp_match( "CONTESTO URBANO sì/no" ,'.[sS].'),
regexp_replace( "CONTESTO URBANO sì/no" ,'.[sS].', 'sì'),
regexp_replace( "CONTESTO URBANO sì/no" ,'.[nN].', 'no')
)
ecco la legenda dopo la correzione:

nel secondo caso occorre intercettare vari casi ma il più complesso è quello relativo agli spazi a fine stringa:

- (.+?)( +)$ per intercettare gli spazi a fine stringa (uno o più spazi)
- .* per gli altri casi;
usando il calcolatore di campi ed aggiornando il campo stesso:

CASE
WHEN regexp_match( "PROVINCIA" , 'Monza.+') > 0 THEN regexp_replace ("PROVINCIA",'Monza.+','Monza Brianza')
WHEN regexp_match( "PROVINCIA" , 'Verbano Cusio O.+') > 0 THEN regexp_replace ("PROVINCIA",'Verbano Cusio O.+','Verbano Cusio Ossola')
WHEN regexp_match( "PROVINCIA" , '(.+?)( +)$') > 0 THEN regexp_replace ("PROVINCIA" , '(.+?)( +)$','\\1')
ELSE "PROVINCIA"
END
Buone letture
- 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
- HfcQGIS – funzione regex_match
- HfcQGIS – funzione regex_replace
- HfcQGIS – espressione CASE
- QGIS.org per scaricare il software libero e Open Source
- HfcQGIS – funzione TRIM