Dividere le stringhe

Ultima modifica: 29-05-2016

Questa volta vogliamo vedere come si affronta il problema della divisione di una stringa in più sottostringe.

Per fare questo c'è bisogno di un carattere separatore per isolare le parole contenute in una stringa.

Vedremo diversi metodi che possiamo utilizzare, dal più ovvio, ma più primitivo, al più evoluto.

Divisione di una stringa in maniera quasi manuale

Per suddividere la stringa viene usata una scansione della stringa stessa e qualora si incontra uno spazio si prende la porzione sinistra della frase. Quindi si continua sino alla fine continuando la ricerca di ulteriori caratteri spazio.

In questo primo esempio mi rifaccio ad un linguaggio di programmazione primordiale (Basic)

Con questo lavoriamo usando solo la funzione Mid la cui sintassi é: Mid(stringa, inizio, numero di caratteri da prelevare). Ricordo che mentre i primi due parametri sono obbligatori, il terzo (numero di caratteri da prelevare) è facoltativo, e se omesso equivale a "Tutto il resto".

Perciò:

  1. poniamo la frase memorizzata nella variabile A:
    A = "Questa è una bella giornata"
  2. nella variabile B poniamo il valore da cui partire per prelevare la porzione di stringa:
    B = 1
  3. istruiamo un ciclo che scannerizza la stringa in tutta la sua lunghezza:
    For I = 1 To Len(A)
  4. se incontriamo un carattere spazio (carattere separatore standard di parole):
    If Mid(A, I, 1) = " " Then
  5. poniamo in una variabile (Parola) il segmento di stringa che va dalla posizione indicata in "B" sino al numero di caratteri contati sinora ("I") meno il valore precedente di "B" (che la prima volta sarà uguale ad 1):
    Parola = Mid(A, B, I - B)
  6. fatto questo poniamo in "B" il valore di "I" incrementato di 1 escludendo così la posizione dello spazio incontrato e preparandoci a prelevare il prossimo segmento si stringa:
    B = I + 1
  7. il ciclo continua sino ad incontrare il prossimo carattere spazio:
    Next
  8. ad ogni spazio incontrato ripetiamo i passaggi dal 4 al 6
  9. finita la scansione della stringa usciamo dal ciclo
  10. usciti dal ciclo preleviamo l'ultimo segmento della stringa:
    Parola = Mid(A, B)

E' ovvio che useremo in qualche modo il contenuto della variabile "Parola" ponendolo in una cella del foglio, in una TextBox, in una MsgBox o dove più ci aggrada. Questo è il possibile codice per eseguire queste azioni:

Sub dividi()
Dim Riga, Col, A, B, I, Parola
Riga = 1: Col = 1
A = "Questa è una bella giornata"
B = 1
For I = 1 To Len(A)
If Mid(A, I, 1) = " " Then
Parola = Mid(A, B, I - B)
Cells(Riga, Col) = Parola
Riga = Riga + 1
B = I + 1
End If
Next
Parola = Mid(A, B)
Cells(Riga, Col) = Parola
End Sub

Divisione di una stringa con funzioni più evolute:

Primo aiutino dalla funzione Instr

Col Visual Basic possiamo contare su qualche aiuto supplementare.

Possiamo per esempio contare sulla funzione Instr che, sempre in questo caso, rileva la posizione del carattere spazio.

La funzione Instr cerca il pattern richiesto a partire da una determinata posizione nella stringa originaria:

la sintassi: InStr([inizio, ]stringa1, stringa2)

dove

In questo modo non eseguiamo una scansione di tutta la stringa, ma verifichiamo solo la presenza del carattere spazio nella stringa

  1. poniamo la variabile "B" ad un 1:
    B = 1
  2. poniamo una variabile di servizio uguale a "B"
    Inizio = B
  3. impostiamo il ciclo tramite l'istruzione While che durerà fintanto che la variabile "B" sarà diversa da 0 (zero)
    While B <> 0
  4. tramite la funzione Instr determiniamo la posizione del primo spazio trovato a partire dalla posizione indicata dalla variabile "Inizio" e la poniamo nella variabile "B"
    B = InStr(Inizio, A, " ")
  5. se "B" è diverso da 0 (zero) preleviamo il primo segmento della stringa contenuta nella variabile "A" e lo poniamo nella variabile "Parola" ed impostiamo la variabile "Inizio" uguale a "B + 1"
    If B <> 0 Then
    Parola = Mid(A, Inizio, B - Inizio)
    Inizio = B + 1
  6. se la variabile "B" è uguale a 0 (zero) siamo alla fine della stringa da dividere quindi poniamo tutta la stringa finale nella variabile "Parola"
    Else
    Parola = Mid(A, Inizio)
  7. finiti questi controlli e rimanendo sempre nel ciclo While mostriamo come più ci aggrada la parola trovata:
    Cells(Riga, 1) = Parola
  8. a questo punto si continua dal punto 3

Questo potrebbe essere un probabile codice da usare con questo metodo:

Sub FunzioneInstr()
Dim A, B, Inizio, Parola, Riga
A = "Questa è una bella giornata"
B = 1
Inizio = B
Riga = 1
While B <> 0
B = InStr(Inizio, A, " ")
If B <> 0 Then
Parola = Mid(A, Inizio, B - Inizio)
Inizio = B + 1
Else
Parola = Mid(A, Inizio)
End If
Cells(Riga, 1) = Parola
Riga = Riga + 1
Wend
End Sub

Secondo aiuto dalla funzione Split

Possiamo semplificare la suddivisione di una stringa in tante sottostringhe utilizzando la Funzione Split. Questa funzione restituisce una matrice in cui sono memorizzate tutte le sottostringhe trovate

La sintassi è: Split(expression, delimiter)

dove

Il lavoro è più semplificato.

  1. Poniamo in una matrice tutte le sottostringhe trovate nella stringa originale in base al carattere identificatore:
    Parole = Split(A, " ")
  2. ottenuta questa matrice la possiamo scorrere come scorriamo una normale matrice:
    For I = LBound(Parole) To UBound(Parole)
    Cells(Riga, 1) = Parole(I)
    Riga = Riga + 1
    Next

Una spiegazione più completa sull'uso della funzione split la possiamo leggere in esempio Suggerimenti (aggiornabile) ed in quest'altra pagina esempio

Il codice potrebbe essere questo:

Sub FunzioneSplit()
Dim A, I, Parole, Riga
A = "Questa è una bella giornata"
Parole = Split(A, " ")
Riga = 1
For I = LBound(Parole) To UBound(Parole)
If Parole(I) <> "" Then
Cells(Riga, 1) = Parole(I)
Riga = Riga + 1
End If
Next
End Sub

Bene. Anche per questa volta spero di aver posto un altro piccolo mattone utile alla crescita della nostra conoscenza del VBA di excel.