Operatore IN fuori da ambiente SQL
A cura di
Totò Fiandaca
| issue
#169
| guida/e
Andrea Borruso
Caso d’uso
Filtrare dei dati strutturati come i CSV usando l’operatore IN; in ambiente SQLite è facilissimo, ecco un esempio:
SELECT "id", "CODICE", "foglio", "prov", "cod_com"
FROM "nomeTabella"
WHERE "foglio" IN (20,21,22)
come fare usando la riga di comando (per esempio in VisiData o/e Miller)?
input.csv:
| id | NUM_PART | foglio | prov | cod_com |
|---|---|---|---|---|
| 43 | 49 | 21 | PA | Axxx |
| 44 | 51 | 21 | PA | Axxx |
| 45 | 54 | 21 | PA | Axxx |
| 46 | 55 | 20 | PA | Axxx |
| 47 | 58 | 20 | PA | Axxx |
| 48 | 61 | 22 | PA | Axxx |
| 49 | 62 | 1 | PA | Axxx |
| 50 | 63 | 10 | PA | Axxx |
| 51 | 65 | 1 | PA | Axxx |
| 52 | 66 | 11 | PA | Axxx |
| 53 | 68 | 1 | PA | Axxx |
Soluzione
- In VisiData: utilizzando i
regexin questo modo:
posizionare il focus sulla colonna foglio, digitare | (che serve a selezionare tramite regex) e come regex: (20|21|22); per ottenere il file con le sole righe selezionate digitare " e poi Ctrl + s per salvare il file.
OSSERVAZIONE: per evitare di selezionare anche valori che contenessereo 20,21 o 22 (per esempio 220,122 ecc..) occorre modificare la regex così ^(20|21|22)$.

- con Miller
mlr --csv filter -S '$foglio=~"(20|21|22)"' test.csv >output.csv
dove -S forza il dato come stringa.
OSSERVAZIONE: per evitare di estrarre righe con valori che contenessereo 20,21 o 22 (per esempio 220,122 ecc..) occorre modificare la regex così ^(20|21|22)$.

output.csv:
| id | NUM_PART | foglio | prov | cod_com |
|---|---|---|---|---|
| 43 | 49 | 21 | PA | Axxx |
| 44 | 51 | 21 | PA | Axxx |
| 45 | 54 | 21 | PA | Axxx |
| 46 | 55 | 20 | PA | Axxx |
| 47 | 58 | 20 | PA | Axxx |
| 48 | 61 | 22 | PA | Axxx |
Prova qui
https://regex101.com/r/adgRHj/1