Alteryx ci mette a disposizione tantissimi tool per il parsing e la pulizia di stringhe di testo, il regex con le sue molteplici modalità, il text to column… e seppur questi tool siano semplici da usare, in alcuni casi può essere necessario utilizzare le classiche formule.
Le funzioni stringa che non possiamo non conoscere per estrarre dati da stringhe di testo sono 6.
Stringhe di testo: POSIZIONE e LUNGHEZZA
- GetWord([Field], n): restituisce la parola che si trova in posizione n
- CountWords([Field]): restituisce la lunghezza della stringhe espressa in n° di parole
- FindString([Field], “Target”): restituisce la posizione in cui si trova il target cercato
- Length([Field]): restituisce la lunghezza della stringa espressa in n° di caratteri
Intrecciando queste 4 funzioni è possibile andare a cercare cosa è dove. Ma dobbiamo fare attenzione, perché la posizione è su base 0, la lunghezza è su base 1. Facciamo un esempio.
Prendiamo la stringa di testo
ITEM = |12 Red Patagonia|
Contiene 3 elementi distinti, l’ID, il colore del prodotto e il nome.
Studio delle parole:
12 | Red | Patagonia | |||
Posizione: | 0 | 1 | 2 | GetWord | |
Lunghezza: | 1 | 2 | 3 | CountWords |
La stringa è composta da 3 parole, la prima in posizione 0 è 12, la seconda in posizione 1 è Red, la terza in posizione 2 è Patagonia.
Studio dei caratteri:
1 | 2 | R | e | d | P | a | t | a | g | o | n | i | a | |||||
Posizione: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | . | . | . | . | . | 15 | FindString | |
Lunghezza: | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | . | . | . | . | . | . | 16 | Length |
La stringa è composta da 16 caratteri, il primo in posizione 0 è 1, il secondo in posizione 1 è 2, il terzo in posizione 2 è lo spazio, e così via fino al 15esimo, l’ultimo.
Vogliamo ad esempio estrarre il colore dalla stringa? Il colore è sempre la seconda parola, subito dopo l’ID:
GetWord([ITEM], 1) = Red
Vogliamo estrarre l’ID? L’ID è sempre la prima parola:
GetWord([ITEM], 0) = 12
Cose da ricordare:
- La posizione parte da 0
- La lunghezza parte da 1
- Lo spazio conta come un carattere ma non conta come una parola
Ora complichiamo un po’ le cose, e supponiamo che l’ultima parte della stringa, che corrisponde alla colonna del nome del prodotto, possa essere composta da più di una parola:
ITEM = |12 Red Patagonia|
ITEM = |12 Red Patagonia Middle|
Funzioni LEFT e RIGHT
Ora che sappiamo come cercare gli elementi di una stringa, vediamo un modo per estrarli:
- Left([FIELD], n): restituisce i primi n caratteri a partire da sinistra
- Right([FIELD], n): restituisce gli ultimi n caratteri, ovvero i primi n caratteri partendo da destra
Sappiamo che la prima parola è l’ID, la seconda è il colore e il nome del prodotto può essere la terza parola, ma anche la terza e la quarta insieme. Non possiamo usare la funzione GetWord, perché le stringhe non sono tutte uguali, contemplano due casi diversi.
O meglio, potremmo. Potremmo contare quante parole ci sono, e con una formula condizionale costruire tutti i casi possibili:
IF CountWords([ITEM])=3 then GetWord([ITEM], 2) ELSEIF CountWords([ITEM])=4 then GetWord([ITEM], 2)+” “+GetWord([ITEM], 3) ENDIF
Se la stringa è fatta di 3 parole, restituiscimi la parola in posizione 2, se invece è composta da 4 parole, allora restituiscimi le parole in posizione 2 e 3 concatenate con uno spazio in mezzo… e così via, ma che lavoraccio! E non è per nulla dinamico.
Partiamo dalle informazioni sicure. Le prime due parole sono fisse, potremmo chiedere un Right della differenza tra la lunghezza totale della stringa e la parte left, ossia lunghezza delle prime due parole sommate:
- La parola in posizione 0 è lunga 2 caratteri {(Length(GetWord([ITEM], 0)}
- La parola in posizione 1 è lunga 3 caratteri {(Length(GetWord([ITEM], 1)}
- 3+2=5
- C’è uno spazio tra le due parole che conta una posizione
- 3+2+1 = 6 {(Length(GetWord([ITEM], 0))+Length(GetWord([ITEM], 1))+1)}
- Ora sappiamo che la parte sinistra della stringa è lunga 6
- Possiamo chiedere un Right della lunghezza totale meno 6 {Right([ITEM], Length([ITEM])-(Length(GetWord([ITEM], 0))+Length(GetWord([ITEM], 1))+1))}