opendatasicilia / tansignari

"T'ansignari e t'appeddiri"
http://tansignari.opendatasicilia.it
Creative Commons Attribution 4.0 International
18 stars 10 forks source link

[Miller] filtro con espressione #243

Closed pigreco closed 1 year ago

pigreco commented 1 year ago

Ho un file CSV così fatto:

image

nella colonna geom_type ci sono vari valori (none, PointZ, MultiPolygonZ, MultiLineStringZM, ecc...) dovrei raggruppare le righe che, nella colonna geom_type, hanno valori che contengono i seguenti termini:

ho usato un filtro con Miller, ma usando || (or) devo scrivere tutti i vari casi possibili, sotto un esempio:

mlr --csv unsparsify then put 'filter $geom_type=="MultiPolygon" || $geom_type=="MultiPolygonZ" || $geom_type=="MultiPolygonZM"'

c'è un modo più snello?

out2.csv

aborruso commented 1 year ago

Totò, le espressioni regolari ci sono anche qui.

Visto che non vuoi MultiPolygonM, potresti scrivere

mlr --csv filter '$geom_type=~"^MultiPolygon(Z|ZM)*$"' out2.csv
aborruso commented 1 year ago

dovrei raggruppare le righe che, nella colonna geom_type, hanno valori che contengono i seguenti termini:

Non ho capito però l'obiettivo. In che senso raggruppare? Mi aggiungi un esempio di output?

pigreco commented 1 year ago

Mi aggiungi un esempio di output?

qui un esempio di output per il caso Polygon

image

aborruso commented 1 year ago

Quindi non vuoi raggruppare, ma soltanto filtrare. Ad esempio tutti i poligoni?

Se sì, puoi usare le regex

pigreco commented 1 year ago

@aborruso come faccio a fare espandere la variabile nel ciclo FOR?

for i in none Line Point Polygon; do
<out.json jq  -c '.layers[]|{name:.name,geom_type:(if (.geometryFields|length) > 0 then .geometryFields[].type else "none" end) }' |  mlr --ijsonl --ocsv unsparsify then filter '$geom_type=~"^.{0,}$i.{0,}$"'>output2/classe_$i.txt
done

lo script di sopra non va, non vede la $i dentro $geom_type=~"^.{0,}$i.{0,}$"'

https://github.com/opendatasicilia/tansignari/files/10679184/out.zip

aborruso commented 1 year ago

Devi attenerti alle regole del bash e fare attenzione ai caratteri speciali. Ti faccio un esempio con il CSV

for i in Line Point;do
<out2.csv  mlrgo --csv unsparsify then filter '$geom_type=~"'"$i"'"';
done

Perché questo strano '"$i"'?

pigreco commented 1 year ago

@aborruso grazie,

per me ha funzionato così: '$geom_type=~"^.{0,}'"$i"'.{0,}$"'

#!/bin/bash

set -x
set -e
set -u
set -o pipefail

# lista valori::
# ogrinfo -so "D:\GitHub\ESRI_FileGeodatabase_GDAL\dati\DBGT_10K_22_V01.gdb"

# crea cartella di output
mkdir -p ./output2

# per ogni oggetto
for i in none Line Point Polygon; do
<out.json jq  -c '.layers[]|{name:.name,geom_type:(if (.geometryFields|length) > 0 then .geometryFields[].type else "none" end) }' |  mlr --ijsonl --ocsv unsparsify then filter '$geom_type=~"^.{0,}'"$i"'.{0,}$"'>output2/classe_$i.txt
done
aborruso commented 1 year ago

Esatto, dovevi applicare quanto ti ho scritto, altrimenti la variabile non si sarebbe espansa

pigreco commented 1 year ago

ricetta fatta e pubblicata

https://tansignari.opendatasicilia.it/ricette/bash/filtro_regex_con_miller/