Differenze tra le versioni di "Scomporre una stringa e caricare ogni parola in una variabile array"

Da Gambas-it.org - Wikipedia.
 
(11 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
Il caso in questione è quello in cui si ha una stringa, nella quale sono presenti anche dei comandi: ''carrello a capo + nuova riga'', così da ottenere visivamente <SPAN style="text-decoration:underline">più righe</span>, come nell'esempio sottostante:
 
Il caso in questione è quello in cui si ha una stringa, nella quale sono presenti anche dei comandi: ''carrello a capo + nuova riga'', così da ottenere visivamente <SPAN style="text-decoration:underline">più righe</span>, come nell'esempio sottostante:
 
 
  ''Questo è il Wiki di Gambas-it''
 
  ''Questo è il Wiki di Gambas-it''
 
  ''cioè è una collezione di documenti ipertestuali''
 
  ''cioè è una collezione di documenti ipertestuali''
 
  ''che può essere modificata dai suoi utilizzatori''
 
  ''che può essere modificata dai suoi utilizzatori''
 
 
L'intenzione è quello di scomporre tale stringa in modo da distinguere ed inserire i vari gruppi di caratteri alfanumerici comprensibli (ossia le normali ''parole'') e diversi dagli spazi, che formano la stringa, in una variabile array.
 
L'intenzione è quello di scomporre tale stringa in modo da distinguere ed inserire i vari gruppi di caratteri alfanumerici comprensibli (ossia le normali ''parole'') e diversi dagli spazi, che formano la stringa, in una variabile array.
  
Riga 11: Riga 9:
 
Poniamo il caso che quella stringa sia caricata tutta nella variabile stringa "wiki".
 
Poniamo il caso che quella stringa sia caricata tutta nella variabile stringa "wiki".
  
===Con l'uso delle funzioni "''Replace''" e "''Split''"===
 
  
  '''Private''' wiki As String = "Questo è il Wiki di Gambas-it\n" &
+
===Con l'uso della funzione "Scan()"===
 +
  Private wiki As String = "Questo è il Wiki di Gambas-it\n" &
 
  "cioè è una collezione di documenti ipertestuali\n" &
 
  "cioè è una collezione di documenti ipertestuali\n" &
 
  "che può essere modificata dai suoi utilizzatori"
 
  "che può essere modificata dai suoi utilizzatori"
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Main()
 +
   
 +
<FONT Color=gray>' ''Trasforma ogni carattere di "nuova riga a capo" in uno spazio:''</font>
 +
  wiki = Replace(wiki, "\n", "\x20")
 +
 
 +
<FONT Color=gray>' ''Individua quanti spazi ci sono fra ciascun elemento della frase.''
 +
' ''Il numero degli spazi ottenuto sarà uguale al numero di elementi autonomi costituenti la frase.''</font>
 +
  wiki = Split(wiki, "\x20").Max
 +
 
 +
<FONT Color=gray>' ''Estrae gli elementi della frase seprandoli dagli spazi che li separano, e li inserisce in un vettore di tipo Stringa:''</font>
 +
  ss = Scan(wiki, "*" & String$(wiki, " *"))
 +
 
 +
End
 +
 
 +
 
 +
===Con l'uso delle funzioni "Replace()" e "Split()"===
 +
Private wiki As String = "Questo è il Wiki di Gambas-it\n" &
 +
"cioè è una collezione di documenti ipertestuali\n" &
 +
"che può essere modificata dai suoi utilizzatori"
 +
 +
 +
Public Sub Button1_Click()
 
   
 
   
   Dim a As String
+
   Dim s As String
   Dim aa As String[]
+
   Dim ss As String[]
 
   Dim j As Byte
 
   Dim j As Byte
 
   
 
   
  <FONT color=#006400>' ''Eliminiamo innanzitutto dalla stringa tutti i comandi:''
+
  <FONT color=gray>' ''Elimina innanzitutto dalla stringa tutti i comandi: "carrello a capo + nuova riga", trasformandoli in semplici spazi.''
' ''"carrello a capo + nuova riga", trasformandoli in semplici spazi.''
+
  ' ''La stringa si trasformerà visivamente in un'unica riga lineare. Questo per preparare la stringa alla successiva funzione ed affinché essa resti unica:''</font>
  ' ''La stringa si trasformerà visivamente in un'unica riga lineare. Questo per preparare''
+
  s = Replace(wiki, "\n", " ")
' ''la stringa alla successiva funzione ed affinché essa resti unica:''</font>
 
    a = Replace(wiki, "\n", " ")
 
 
   
 
   
  <FONT color=#006400>' ''Si scompone, quindi, la stringa così ottenuta, ponendo come punto''
+
  <FONT color=gray>' ''Si scompone, quindi, la stringa così ottenuta, ponendo come punto di divisione di ogni elemento dall'altro gli spazi. Si pone a "True" l'ultimo parametro della funzione "Split()", in modo tale da assicurarsi evitare completamente di prendere in considerazione qualsiasi elemento vuoto.''
' ''di divisione di ogni elemento dall'altro gli spazi. Si pone a "True" l'ultimo parametro''
+
  ' ''Nella variabile array "aa" vi sarà, quindi, una parola alfanumerica per ciascun elemento:''</font>
' ''della funzione "Split", in modo tale da assicurarsi completamente la non considerazione di qualsisi spazio.''
+
  ss = Split(s, " ", "", True)
  ' ''Nella variabile array "aa" avremo, quindi, una parola alfanumerica per ciascun elemento:''</font>
 
    aa = Split(a, " ", "", True)
 
 
   
 
   
  <FONT color=#006400>' ''Andiamo a vedere il contenuto di ciascun elemento dell'array:''</font>
+
  <FONT color=gray>' ''Mostra il contenuto di ciascun elemento dell'array:''</font>
  for j = 0 to aa.Max
+
  For j = 0 to ss.Max
    Print aa[j]
+
    Print ss[j]
  Next
+
  Next
 
   
 
   
  '''End'''
+
  End
  
  
===Senza la funzione "''Split''" e senza usare un file di appoggio===
+
===Senza la funzione "Split()" e senza usare un file di appoggio===
come vedremo nel paragrafo sottostante, per poter distinguere le parole all'interno di una stringa potrà essere utilizzato "''Input''" al posto della funzione ''Split''. Se, inoltre, non vogliamo usare con ''Input'' alcun file di appoggio, potremo usare i ''Memory Stream'', dato che questi si comportano - e possono essere quindi gestiti - in modo analogo ai file:
+
Come vedremo nel paragrafo sottostante, per poter distinguere le parole all'interno di una stringa potrà essere utilizzato ''Input'' al posto della funzione "Split()". Se, inoltre, non vogliamo usare con ''Input'' alcun file di appoggio, potremo usare i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'', dato che questi si comportano - e possono essere quindi gestiti - in modo analogo ai file:
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
   
 
   
Riga 51: Riga 66:
 
   Dim p As Pointer
 
   Dim p As Pointer
 
   Dim m As Stream
 
   Dim m As Stream
 +
  Dim j As Byte
 +
  Dim ss As New String[]
 +
 
 +
  s = "Questa è una prova"
 +
 +
<FONT color=gray>' ''Punta con una variabile di tipo "Pointer" alla variabile stringa:''</font>
 +
  p = Alloc(s)
 +
 +
<FONT color=gray>' ''Dal "Pointer" genera lo "Stream":''</font>
 +
  m = Memory p For Read
 +
 +
<FONT color=gray>' ''In qualunque modo bisogna conoscere il numero delle parole contenute nella variabile stringa "s":''</font>
 +
  For j = 0 To 3
 +
    Input #m, s
 +
<FONT color=gray>' ''Carica ciascuna parola, distinta l'una dall'altra, nella variabile-array:''</font>
 +
    ss.add(s)
 +
  Next
 +
 +
  Free(p)
 +
 +
End
 +
oppure anche quest'altro esempio:
 +
Private p As Pointer
 +
 +
 +
Public Sub Button1_Click()
 +
 +
  Dim s, s1 As String
 +
  Dim m As Stream
 +
  Dim j As Integer
 +
  Dim ss As New String[]
 
   
 
   
 +
  s = "hello world! , hello gambas  "
 
   
 
   
  s = "Questa è una prova"
+
<FONT color=gray>' ''Alloca sufficiente memoria:''</font>
 +
  p = Alloc(SizeOf(gb.Byte), 16)
 
   
 
   
<FONT color=#006400>' ''Puntiamo con una variabile di tipo "Pointer" alla variabile stringa:''</font>
+
  m = Memory p For Read Write
  p = VarPtr(s)
 
 
   
 
   
  <FONT color=#006400>' ''Dal "Pointer" generiamo lo "Stream":''</font>
+
  <FONT color=gray>' ''Scrive il contenuto della variabile "s" nella variabile di tipo "Stream":''</font>
  m = Memory p For Read
+
  Print #m, s
 +
 +
  While Not Eof(m)
 +
    Seek #m, j
 +
    Input #m, s1 
 +
<FONT color=gray>' ''Pone il filtro:''</font>
 +
    Select Case s1
 +
<FONT color=gray>' ''Se la variabile contiene il solo carattere della virgola, allora salta l'operazione di scrittura in console e torna al ciclo:''</font>
 +
      Case ","
 +
        Continue     
 +
<FONT color=gray>' ''Se la variabile non contiene un carattere alfanumerico, allora vorrà dire che il contenuto utile è terminato, e quindi si esce dal ciclo:''</font>
 +
      Case ""
 +
        Break
 +
    End Select 
 +
    ss.Add(s1)
 +
<FONT color=gray>' ''Dà al comando "Seek" il numero del byte, dal quale leggere:''</font>
 +
    j = j + Len(s1) + 1
 +
  Wend
 +
 +
End
 
   
 
   
<FONT color=#006400>' ''In qualunque modo dobbiamo conoscere il numero delle parole,''
 
' ''contenuto nella variabile stringa "s":''</font>
 
  For j = 0 To 3
 
    Input #m, s
 
<FONT color=#006400>' ''Andiamo a leggere ciascuna parola distinta l'una dall'altra:''</font>
 
    Print s
 
  Next
 
 
   
 
   
  '''End'''
+
  Publib Sub Form_Close()
 
+
 
 
+
<FONT color=gray>' ''Disalloca la parte della memoria precedentemente allocata:''</font>
 +
  Free(p)
 +
 
 +
End
  
  
Riga 77: Riga 139:
 
In tal caso possiamo adottare due modalità:
 
In tal caso possiamo adottare due modalità:
  
===Lettura con il metodo ''File.Load''===
+
===Lettura con il Metodo "File.Load()"===
Il file di testo viene letto con il metodo ''.Load'' della classe File; ed i dati risultanti saranno posti in una variabile di tipo stringa:
+
Il file di testo viene letto con il Metodo ".Load()" della classe File; ed i dati risultanti saranno posti in una variabile di tipo stringa:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim a As String
 
   Dim a As String
 
   
 
   
  a = File.Load("percorso_del_file_di_testo")
+
  a = File.Load("<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>")
 
   
 
   
  <FONT color=#006400>' ''Qui, poi, le funzioni "Split" e "Replace"......''</font>
+
  <FONT color=gray>' ''Qui, poi, le funzioni "Split" e "Replace"......''</font>
 
   
 
   
  '''End'''
+
  End
Si procederà poi a distinguere le varie parole della stringa, caricata nella variabile, mediante le due funzioni "''Split''" e "''Replace''" sostanzialmente con le medesime modalità viste prima.
+
Si procederà poi a distinguere le varie parole della stringa, caricata nella variabile, mediante le due funzioni native "Split()" e "Replace()" sostanzialmente con le medesime modalità viste prima.
  
  
 
===Lettura con ''Open....For Read/Input''===
 
===Lettura con ''Open....For Read/Input''===
 
Con quest'altra modalità si leggerà il file di testo come un file binario mediante la fuzione ''Input''. Come è noto,  "Input" legge le stringhe in un File di testo fino all'interruzione dello spazio o al carattere di "nuova linea". Ciò permetterà di individuare ogni parola del testo, delimitata da uno spazio, e di caricarla successivamente in un nuovo elemento di un'apposita variabile-array:
 
Con quest'altra modalità si leggerà il file di testo come un file binario mediante la fuzione ''Input''. Come è noto,  "Input" legge le stringhe in un File di testo fino all'interruzione dello spazio o al carattere di "nuova linea". Ciò permetterà di individuare ogni parola del testo, delimitata da uno spazio, e di caricarla successivamente in un nuovo elemento di un'apposita variabile-array:
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim fl As File   
 
   Dim fl As File   
   Dim s$ As String
+
   Dim s As String
   Dim ss$ As New String[]
+
   Dim ss As New String[]
   Dim j As Byte
+
   Dim b As Byte
+
 
+
  fl = Open "<FONT color=darkgreen>''/percorso/del/file/di/testo''</font>" For Read  <FONT color=gray>' ''...oppure "Input"''</font>
  fl = Open "percorso_del_file_di_testo" For Read  <FONT color=#006400>' ''...oppure "Input"''</font>
 
 
 
   
 
   
 
   While Not Eof(fl)
 
   While Not Eof(fl)
     Input #fl, s$
+
     Input #fl, s
  <FONT color=#006400>' ''Ogni parola del testo, delimitata da uno spazio, viene individuata''
+
  <FONT color=gray>' ''Ogni parola del testo, delimitata da uno spazio, viene individuata e caricata in un nuovo elemento della variabile-array "ss":''</font>
' ''e caricata in un nuovo elemento della variabile-array ss$:''</font>
+
     ss.Push(s)
     ss$.Add(s$)
 
 
   Wend
 
   Wend
 
   
 
   
  <FONT color=#006400>' ''Mostra in console ogni stringa (parola) contenuta in ciascun elemento della variabile-array ss$:''</font>
+
  <FONT color=gray>' ''Mostra in console ogni stringa (parola) contenuta in ciascun elemento della variabile-array "ss":''</font>
  For j = 0 To ss$.Max
+
  For b = 0 To ss.Max
    Print ss$[j]
+
    Print ss[b]
  Next
+
  Next
 
    
 
    
  '''End'''
+
  End

Versione attuale delle 16:42, 29 giu 2024

Il caso in questione è quello in cui si ha una stringa, nella quale sono presenti anche dei comandi: carrello a capo + nuova riga, così da ottenere visivamente più righe, come nell'esempio sottostante:

Questo è il Wiki di Gambas-it
cioè è una collezione di documenti ipertestuali
che può essere modificata dai suoi utilizzatori

L'intenzione è quello di scomporre tale stringa in modo da distinguere ed inserire i vari gruppi di caratteri alfanumerici comprensibli (ossia le normali parole) e diversi dagli spazi, che formano la stringa, in una variabile array.


Se la stringa è posta in una variabile

Poniamo il caso che quella stringa sia caricata tutta nella variabile stringa "wiki".


Con l'uso della funzione "Scan()"

Private wiki As String = "Questo è il Wiki di Gambas-it\n" &
"cioè è una collezione di documenti ipertestuali\n" &
"che può essere modificata dai suoi utilizzatori"


Public Sub Main()
   
' Trasforma ogni carattere di "nuova riga a capo" in uno spazio:
  wiki = Replace(wiki, "\n", "\x20")
  
' Individua quanti spazi ci sono fra ciascun elemento della frase.
' Il numero degli spazi ottenuto sarà uguale al numero di elementi autonomi costituenti la frase.
  wiki = Split(wiki, "\x20").Max
  
' Estrae gli elementi della frase seprandoli dagli spazi che li separano, e li inserisce in un vettore di tipo Stringa:
  ss = Scan(wiki, "*" & String$(wiki, " *"))
  
End


Con l'uso delle funzioni "Replace()" e "Split()"

Private wiki As String = "Questo è il Wiki di Gambas-it\n" &
"cioè è una collezione di documenti ipertestuali\n" &
"che può essere modificata dai suoi utilizzatori"


Public Sub Button1_Click()

 Dim s As String
 Dim ss As String[]
 Dim j As Byte

' Elimina innanzitutto dalla stringa tutti i comandi: "carrello a capo + nuova riga", trasformandoli in semplici spazi.
' La stringa si trasformerà visivamente in un'unica riga lineare. Questo per preparare la stringa alla successiva funzione ed affinché essa resti unica:
 s = Replace(wiki, "\n", " ")

' Si scompone, quindi, la stringa così ottenuta, ponendo come punto di divisione di ogni elemento dall'altro gli spazi. Si pone a "True" l'ultimo parametro della funzione "Split()", in modo tale da assicurarsi evitare completamente di prendere in considerazione qualsiasi elemento vuoto.
' Nella variabile array "aa" vi sarà, quindi, una parola alfanumerica per ciascun elemento:
 ss = Split(s, " ", "", True)

' Mostra il contenuto di ciascun elemento dell'array:
 For j = 0 to ss.Max
   Print ss[j]
 Next

End


Senza la funzione "Split()" e senza usare un file di appoggio

Come vedremo nel paragrafo sottostante, per poter distinguere le parole all'interno di una stringa potrà essere utilizzato Input al posto della funzione "Split()". Se, inoltre, non vogliamo usare con Input alcun file di appoggio, potremo usare i Memory Stream, dato che questi si comportano - e possono essere quindi gestiti - in modo analogo ai file:

Public Sub Button1_Click()

 Dim s As String
 Dim p As Pointer
 Dim m As Stream
 Dim j As Byte
 Dim ss As New String[]
 
 s = "Questa è una prova"

' Punta con una variabile di tipo "Pointer" alla variabile stringa:
 p = Alloc(s)

' Dal "Pointer" genera lo "Stream":
 m = Memory p For Read

' In qualunque modo bisogna conoscere il numero delle parole contenute nella variabile stringa "s":
 For j = 0 To 3
   Input #m, s
' Carica ciascuna parola, distinta l'una dall'altra, nella variabile-array:
   ss.add(s)
 Next

 Free(p)

End

oppure anche quest'altro esempio:

Private p As Pointer


Public Sub Button1_Click()

 Dim s, s1 As String
 Dim m As Stream
 Dim j As Integer
 Dim ss As New String[] 

 s = "hello world! , hello gambas   "

' Alloca sufficiente memoria:
 p = Alloc(SizeOf(gb.Byte), 16)

 m = Memory p For Read Write

' Scrive il contenuto della variabile "s" nella variabile di tipo "Stream":
 Print #m, s

 While Not Eof(m)
   Seek #m, j
   Input #m, s1  
' Pone il filtro:
   Select Case s1
' Se la variabile contiene il solo carattere della virgola, allora salta l'operazione di scrittura in console e torna al ciclo:
     Case ","
       Continue       
' Se la variabile non contiene un carattere alfanumerico, allora vorrà dire che il contenuto utile è terminato, e quindi si esce dal ciclo:
     Case ""
       Break
   End Select  
   ss.Add(s1) 
' Dà al comando "Seek" il numero del byte, dal quale leggere:
   j = j + Len(s1) + 1
 Wend

End


Publib Sub Form_Close()
 
' Disalloca la parte della memoria precedentemente allocata:
  Free(p)
 
End


Se la stringa viene letta da un file di testo

In tal caso possiamo adottare due modalità:

Lettura con il Metodo "File.Load()"

Il file di testo viene letto con il Metodo ".Load()" della classe File; ed i dati risultanti saranno posti in una variabile di tipo stringa:

Public Sub Button1_Click()

 Dim a As String

 a = File.Load("/percorso/del/file/di/testo")

' Qui, poi, le funzioni "Split" e "Replace"......

End

Si procederà poi a distinguere le varie parole della stringa, caricata nella variabile, mediante le due funzioni native "Split()" e "Replace()" sostanzialmente con le medesime modalità viste prima.


Lettura con Open....For Read/Input

Con quest'altra modalità si leggerà il file di testo come un file binario mediante la fuzione Input. Come è noto, "Input" legge le stringhe in un File di testo fino all'interruzione dello spazio o al carattere di "nuova linea". Ciò permetterà di individuare ogni parola del testo, delimitata da uno spazio, e di caricarla successivamente in un nuovo elemento di un'apposita variabile-array:

Public Sub Button1_Click()

 Dim fl As File  
 Dim s As String
 Dim ss As New String[]
 Dim b As Byte
 
 fl = Open "/percorso/del/file/di/testo" For Read   ' ...oppure "Input"

 While Not Eof(fl)
   Input #fl, s
' Ogni parola del testo, delimitata da uno spazio, viene individuata e caricata in un nuovo elemento della variabile-array "ss":
   ss.Push(s)
 Wend

' Mostra in console ogni stringa (parola) contenuta in ciascun elemento della variabile-array "ss":
 For b = 0 To ss.Max
   Print ss[b]
 Next
  
End