<< Back

Parsing di stringhe con formule

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:

  1. La posizione parte da 0
  2. La lunghezza parte da 1
  3. 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))}

Federica Ferrarini

Trainer - Milano

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.