Lavorare con le stringhe

Transcript

Lavorare con le stringhe
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
Un set di caratteri alfanumerici – cosa c’è di più semplice?
Le stringhe sono fondamentali nel concetto, ma ottenere le informazioni di cui hai
bisogno da esse è una storia diversa.
Le seguenti sezioni includono le cose fondamentali di cui hai bisogno per lavorare con
le stringhe e forniscono alcune funzioni che puoi riusare entro le tue soluzioni.
Confronto di stringhe
Puoi confrontare stringhe per determinare se esse contengono caratteri equivalenti e
come differiscono se non corrispondono.
Quando confronti due stringhe, tu stai confrontando in realtà il valore ANSI di ciascun
carattere al valore del corrispondente carattere nell’altra stringa.
Puoi specificare se vuoi fare confronti case-sensitive o se vuoi ignorare il caso e
semplicemente confrontare i caratteri delle stringhe.
Specificare l’Impostazione del Confronto-Stringhe per un Modulo
La dichiarazione Option Compare determina come sono confrontate le stringhe entro
un modulo. Vi sono tre impostazioni per la dichiarazione
Option Compare:
Option Compare Binary I confronti stringa sono del tipo case-sensitive.
Option Compare Binary
è l’impostazione predefinita del confronto-stringa di tutte le applicazioni di Office
eccetto Microsoft Access,
per il quale Option Compare Database è il predefinito.
Option Compare Text I confronti stringa sono del tipo case-insensitive.
Per rendere il confronto stringa case-insensitive il metodo predefinito per un modulo,
aggiungi questa dichiarazione alla sezione Dichiarazioni del modulo.
Option Compare Database I confronti stringa dipendono dall’ordinamento per l’ambiente specificato; l’ordinamento
predefinito è del tipo case-insensitive.
L’impostazione Option Compare Database è disponibile solo per i database di Access.
Nota che quando crei un nuovo modulo in Access, la dichiarazione Option Compare
Database è automaticamente inserita nella sezione Dichiarazioni del modulo. Se
cancelli Option Compare Database, l’impostazione predefinita per il confronto stringhe
1 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
del modulo è Option Compare Binary.
Importante Se stai scrivendo codice in Access che vorresti esportare verso un’altra applicazione
VBA ospite, dovresti specificare esplicitamente i confronti stringa come binari o
base-testo nella linea che esegue il confronto.
Poiché l’impostazione Option Compare Database è accessibile solamente in Access, il
codice non si compilerà quando tu lo importi in un’altra applicazione a meno che non
rimuovi questa impostazione.
Se tu hai specificato esplicitamente il metodo del confronto-stringa
per ciascuna linea che esegue il confronto, puoi esportare il codice ed essere
fiducioso che i confronti stringa continueranno a funzionare come atteso, dopo che
rimuovi l’impostazione Option Compare Database.
Suggerimento Per cambiare l’ordinamento per un database, fai click su Opzioni
del menu Strumenti, fai click sulla scheda Generale, e poi modifica l’impostazione
Ordinamento nuovi database.
Dopo aver modificato questa impostazione, qualunque nuovo database che tu crei
eseguirà i confronti testo basati sul nuovo ordinamento; il cambiamento di questa
opzione non ha alcun effetto su database esistenti.
Confronto Stringhe Utilizzando gli Operatori di Confronto
Dal momento che stai confrontando effettivamente valori ANSI
quando confronti due stringhe, puoi usare gli stessi operatori di confronto che useresti
con le espressioni numeriche:
maggiore di(>), minore di (<), uguale a (=), e così via.
In aggiunta a questi operatori di confronto, puoi anche usare l’operatore
Like, che è specifico per l’uso nel confronto delle stringhe, includendo le stringhe che
contengono caratteri jolly.
Utilizzare Operatori di Confronto
Quando utilizzi operatori di confronto quale maggiore di (>)
o minore di(<) per confrontare due stringhe, il risultato che
ottieni dipende dall’impostazione del confronto-stringa per il modulo. Considera il
seguente esempio:
“vba”> “VBA”
Se l’impostazione del confronto-stringa è Option Compare Binary, il confronto
restituisce
True.
Quando VBA esegue un confronto di testo binario, esso confronta i valori binari per
2 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
ciascuna posizione corrispondente nella stringa fintanto ne trova due che differiscono.
In questo esempio, la lettera minuscola “v” corrisponde al
valore ANSI 118, mentre la lettera maiuscola “V” corrisponde al valore ANSI 86.
Dal momento che 118 è maggiore di 86, il confronto ritorna True.
Nota Per le tabelle dei valori ANSI e dei caratteri che rappresentano, cerca
l’indice dei Riferimenti all’Help di Visual Basic per “ANSI”.
Se l’impostazione de confronto-stringa è Option Compare Text, “vba” > “VBA” ritorna
False, dal momento
che le stringhe sono equivalenti a parte il caso.
In un database di Access, se l’impostazione del confronto-stringhe è Option Compare
Database
e
l’opzione Ordinamento nuovi database è impostato a Generale (l’impostazione di
default),
il confronto della stringa è del tipo case-sensitive e l’esempio ritorna False.
Utilizzare l’Operatore Like
Puoi eseguire confronti di stringhe di caratteri jolly utilizzando l’operatore Like. La
seguente tabella mostra i caratteri jolly supportati da VBA.
Carattere
Rappresenta
Esempio
*
Qualunque
t* ricerca
numero
qualunque
di caratteri
parola con la &quot;t.&quot;
?
Qualunque
t??t ricerca
carattere
qualunque
singolo parola di quattro-lettere che inizia e finisce con la &quot;t.&quo
#
Qualunque
1#3 ricerca
singolaqualunque
cifra (0–9)numero di tre-cifre che inizia con 1 e finisce con &quot;3.&quot
[elencocar] Qualunque
[a-z] carattere
ricerca qualunque
singolo inlettera
elencocar
che cade tra &quot;a&quot; e &quot;z&quot; (il tipo-di-s
[!elencocar] Qualunque
[!A-Z]carattere
esclude singolo
I caratteri
non
alfabetici
in elencocar
maiuscoli (il tipo-di-sensibilità dipende dall’impostaz
Puoi usare l’operatore Like per eseguire la convalida di dati o ricerche con caratteri jolly. P. e.,
supponi che vuoi assicurarti che un utente debba inserire un numero di telefono nel formato
nnn-nnn-nnnn.
Puoi usare l’operatore Like per controllare che l’inserimento sia valido come fa la seguente
procedura:
Function ValidPhone(strPhone As String) As Boolean
' Questa procedura controlla che il valore inserito sia
' un numero valido e formatttato nella maniera corretta.
3 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
ValidPhone = strPhone Like &quot;###-###-####&quot;
End Function
Questa procedura confronta caratteri in una stringa per assicurare che certe posizioni
contengono caratteri numerici. Al fini di restituire True, tutti i caratteri debbono essere digitati
tra 0 e 9 o trattini, e i trattini debbono essere presenti nella posizione corretta nella stringa.
Sovrapporsi all’Impostazione Predefinita del Confronto-Stringhe
Per eseguire un confronto di stringa entro una procedura e sovrapporre l’impostazione del
confronto-stringa per il modulo, puoi utilizzare la funzione
StrComp. La funzione StrComp prende due stringhe come argomenti, insieme con un
argomento compare, che puoi usare per specificare il tipo di confronto. Le impostazioni possibili
per l’argomento compare sono
vbBinaryCompare, vbTextCompare, e (in Access) vbDatabaseCompare. Se ometti questo
argomento, la funzione
StrComp utilizza il metodo di confronto predefinito del modulo.
La seguente tabella elenca i possibili valori restituiti per la funzione StrComp:
Se
Allora StrComp restituisce
string1 < string2
-1
string1 = string2
0
string1 > string2
1
string1Or
string2
Is Null Null
P. e., eseguendo il seguente codice dalla finestra Immediata,
genera “1”, indicando che il valore ANSI del primo carattere è
maggiore del valore ANSI del primo carattere nella seconda stringa:
? StrComp(&quot;vba&quot;, &quot;VBA&quot;, vbBinaryCompare)
4 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
D’altra parte, se specifichi il confronto della stringa base-testo, questo codice genera “0”,
indicando che le due stringhe sono identiche:
? StrComp(&quot;vba&quot;, &quot;VBA&quot;, vbTextCompare)
Altre funzioni stringa VBA che eseguono confronti di stringa forniscono anche un argomento
compare che puoi usare per
sovrapporre l’impostazione predefinita del confronto-stringa per quella chiamata di funzione.
P. e., le funzioni InStr ed InStrRev hanno entrambe un argomento compare.
Calcolare la lunghezza della stringa
Spesso hai bisogno di conoscere la lunghezza di una stringa per analizzare il suo contenuto.
Puoi usare la funzione Len per calcolare la lunghezza di una stringa:
Dim lngLen As Long
lngLen= Len(strText)
Quando VBA memorizza una stringa,
memorizza sempre la lunghezza della stringa in un intero lungo all’inizio della stringa.
La funzione
Len recupera questo valore e perciò è molto veloce.
La funzione Len è utile quando hai
bisogno di determinare se una stringa è a lunghezza-zero (“”).
Piuttosto che confrontare la stringa in questione con una stringa
a lunghezza-zero per determinare se esse sono equivalenti,
puoi semplicemente controllare se la lunghezza della stringa è uguale 0. P.
e.:
If Len(strText) > 0 Then
' Qui fai quello che vuoi.
End If
Ricercare una stringa
Quando hai bisogno di sapere se una stringa contiene un particolare carattere di un gruppo di
caratteri, puoi esplorare la stringa utilizzando una di due funzioni. La candidata tradizionale per
questo compito è la funzione InStr, che puoi usare per trovare una stringa entro un’altra. La
funzione
InStr confronta due stringhe, e se la seconda
stringa è contenuta nella prima, essa restituisce la posizione in cui la sottostringa inizia. Se la
funzione
InStr non trova la sottostringa,
essa restituisce 0.
5 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
La funzione InStr prende un argomento opzionale,
l’argomento inizio, in cui puoi specificare la posizione dell’inizio della ricerca, la funzione InStr
inizia la ricerca dal primo carattere della stringa.
La più recente versione di VBA include una funzione chiamata
InStrRev, che si comporta nello stesso modo della funzione InStr, eccetto che inizia la
ricerca alla fine della stringa piuttosto che all’inizio.
Come per la funzione InStr, puoi specificare una posizione di partenza per la funzione InStrR
ev
;
essa cercherà all’indietro attraverso la stringa cominciando da quel punto. Se sai che la
sottostringa che stai cercando probabilmente cade alla fine della stringa, la funzione
InStrRev
può rivelarsi la migliore scelta. P. e., la funzione
InStrRev
fa diventare più semplice analizzare il percorso di un file e restituire
proprio il nome del file. La prossima sezione, “Restituire Parti di Stringa” mostra un esempio di
come usare la funzione InStrRev.
Nota Sia la funzione InStr che la funzione nStrRev
restituiscono lo stesso valore quando essi localizzano la stessa sottostringa.
Sebbene la funzione InStrRev inizi la ricerca dalla destra della stringa, essa conta i caratteri
dal lato sinistro, come fa la funzione
InStr. P. e., richiamando o
la funzione
InStr o la
InSt
rRev
per cercare nella stringa &quot;C:Temp&quot; la sottostringa “C:” si ottiene 1.
Però, se la sottostringa appare più di una volta, e non hai specificato un valore per
l’argomento inizia, la funzione InStr restituisce la posizione della prima istanza e la funzione In
StrRev
restituisce la posizione dell’ultima istanza.
La seguente procedura conta le ricorrenze di un carattere particolare di un gruppo di caratteri
in una stringa. Per richiamare la procedura, passa nella stringa, la sottostringa che stai
cercando, ed una costante che indichi se la ricerca dovrebbe essere del tipo case-sensitive.
I possibili valori delle costanti sono specificate dalle costanti incorporate elencate in vbComp
areMethod
, che raggruppa le tre costanti di confronto-stringa di VBA
(vbBinaryCompare, vbDatabaseCompare, e vbTextCompare). Se tu dichiari un
argomento come tipo
vbCompareMethod, VBA elenca le costanti in quel raggruppamento quando richiami la
procedura.
Questo è un modo conveniente per ricordare quali valori un argomento prende.
Puoi anche definire le tue personali costanti numerate ed usarle come tipi di dati.
6 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
La seguente procedura CountOccurrences utilizza la funzione InStr per cercare il testo
specificato e restituisce il valore della posizione in cui questo accade; p. e., se è il terzo
carattere nella stringa, la funzione
InStr
restituisce 3. Questo valore è memorizzato in una variabile
temporanea così che il valore può essere mantenuto dopo la successiva chiamata alla
funzione InStr. La procedura incrementa la variabile contatore, che mantiene traccia del
numero delle ricorrenze trovate, e poi imposta la posizione di inizio per la successiva chiamata
alla funzione
InStr. La nuova posizione d’inizio è la posizione in cui il testo di
ricerca è stato trovato, più la lunghezza della stringa di ricerca.
Impostando la posizione d’inizio in questa maniera, sei sicuro che non localizzi la stessa
stringa due volte quando stai cercando il testo che è lungo più di un carattere.
Function CountOccurrences(strText As String, _
strFind As String, _
Optional lngCompare As VbCompareMethod) As Long
' Conta le ricorrenze di un particolare carattere o caratteri.
' Se l'argomento lngCompare è omesso, la procedura esegue il confronto binario.
Dim lngPos As Long
Dim lngTemp As Long
Dim lngCount As Long
' Viene indicata una posizione di partenza. Non è necessaria per la prima
' volta attraverso il ciclo, ma sarà necessaria nei successivi passaggi.
lngPos = 1
' Esegue il ciclo almeno una volta.
Do
' Memorizza la posizione in cui ricorre il primo degli strFind.
lngPos = InStr(lngPos, strText, strFind, lngCompare)
' Memorizza la posizione in una variabile temporanea.
lngTemp = lngPos
' Controlla che strFind sia stato trovato.
If lngPos > 0 Then
' Incrementa la variabile contatore.
lngCount = lngCount + 1
' Definisce una nuova posizione di partenza.
lngPos = lngPos + Len(strFind)
End If
' Cicla fintanto che l'ultima ricorrenza sia stata trovata.
Loop Until lngPos = 0
' Ritorna il numero delle ricorrenze trovate.
CountOccurrences = lngCount
End Function
7 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
Richiamando, come segue, questa funzione dalla finestra Immediata, restituisce “3”:
? CountOccurrences(&quot;This is a test&quot;, &quot;t&quot;, vbTextCompare) Restituire Parti di stringa
Per lavorare con parte del contenuto di una stringa, hai bisogno di analizzare la stringa.
Puoi usare la funzione InStr o InStrRev
per trovare la posizione da cui iniziare ad analizzare la stringa.
Una volta che hai localizzata quella posizione, puoi utilizzare le funzioni Left, Right, e Mid
per fare il lavoro.
Le funzioni Left e Right restituiscono uno specificato numeri di caratteri o dalla parte sinistra
o dalla parte destra della stringa.
La funzione Mid è la più flessibile delle funzioni di analisi – puoi specificare un punto di inizio
in qualunque posto della stringa, seguito dal numero di caratteri che vuoi restituire.
Nota Alcune delle funzioni stringa di VBA sono di due tipi, una che restituisce una stringa
ed una che restituisce un valore
Variant di tipo-stringa.
Il nome delle funzioni che restituiscono una stringa includono un segno di dollaro (“$”); p. e.,
Chr$
,
Format$
,
LCase$
,
Left$
,
LTrim$
,
Mid$
,
Right$
,
RTrim$
,
Space$
,
Trim$
,e
UCase$
.
Le funzioni che restituiscono un valore Variant di tipo-stringa non hanno alcun segno di
dollaro; p. e.,
Chr, Format, LCase, Left, LTri
m
,
Mid
8 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
,
Right
,
RTrim, Space, Trim, e Ucase.
Le funzioni che restituiscono stringhe sono più veloci; comunque, otterrai un errore se le
richiamerai con un valore che è Null. Le funzioni che restituiscono un valore Variant di
tipo-stringa gestiscono i valori
Null
senza errore. Gli esempi di codice in questo capitolo utilizzano le funzioni che restituiscono
stringhe nel modo appropriato.
La seguente procedura analizza il percorso di un file e restituisce una delle seguenti parti: il
percorso ogni cosa tranne il nome del file), il nome del file, la lettera dell’unità, o l’estensione del
file.
Puoi specificare quale parte della stringa vuoi restituire passando una costante all’argomento
lngPart
. L’argomento
lngPart
è definito come tipo
opgParsePath
,
che contiene costanti numerate personalizzate dichiarate nel modulo modPublicDefs
seguente:
' Error log file name
Public Const APP_ERROR_LOG As String = &quot;Ch07Err.txt&quot;
' Error constants
Public Const ERR_SUBSCRIPT As Long = 9
' Enumeration constants
Public Enum opgParsePath
FILE_ONLY
PATH_ONLY
DRIVE_ONLY
FILEEXT_ONLY
End Enum
Enum opgDateInterval
YEARS
MONTHS
WEEKS
9 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
DAYS
End Enum
Enum opgTimeInterval
SEC
MIN_SEC
HOUR_MIN_SEC
DAY_HOUR_MIN_SEC
End Enum
Enum opgDelimiters
TABCHAR = 9
LF = 10
CR = 13
POUND = 35
COMMA = 44
PERIOD = 46
COLON = 58
SEMICOLON = 59
End Enum
Notare che la seguente procedura utilizza la funzione
InStrRev per trovare l’ultimo separatore del percorso, o backslash (), nella stringa.
Se usi la funzione InStr, dovresti scrivere un ciclo per assicurarti che hai trovato l’ultimo.
Con la funzione InStrRev, sai che il primo backslash che trovi è l’ultimo nella stringa,
e i caratteri a destra di esso debbono essere il nome del file.
Function ParsePath(strPath As String, _
lngPart As opgParsePath) As String
' Questa procedura prende il path di un file e restituisce
' il path (tutto tranne il nome del file), il ' nome del file , la lettera dell'unità, o l'estensione del file,
' a secondo di quale costante sia passata.
Dim lngPos As Long
Dim strPart As String
Dim blnIncludesFile As Boolean
'Controlla che questo sia il path di un file.
' Trova l'ultimo separatore del path.
lngPos = InStrRev(strPath, &quot;&quot;)
' Determina quale parte della stringa dopo l'ultimo backslash
10 / 11
Lavorare con le stringhe - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Venerdì 17 Febbraio 2006 00:00 - Ultimo aggiornamento Martedì 27 Aprile 2010 12:41
' contenga un intervallo.
blnIncludesFile = InStrRev(strPath, &quot;.&quot;) > lngPos
If lngPos > 0 Then
Select Case lngPart
' Restituisce il nome del file.
Case opgParsePath.FILE_ONLY
If blnIncludesFile Then
strPart = Right$(strPath, Len(strPath) - lngPos)
Else
strPart = &quot;&quot;
End If
'Restituisce il path.
Case opgParsePath.PATH_ONLY
If blnIncludesFile Then
strPart = Left$(strPath, lngPos)
Else
strPart = strPath
End If
' Restituisce il drive.
Case opgParsePath.DRIVE_ONLY
strPart = Left$(strPath, 3)
' Restituisce l'estensione del file.
Case opgParsePath.FILEEXT_ONLY
If blnIncludesFile Then
' Prende tre caratteri dopo l'intervallo.
strPart = Mid(strPath, InStrRev(strPath, &quot;.&quot;) + 1, 3)
Else
strPart = &quot;&quot;
End If
Case Else
strPart = &quot;&quot;
End Select
End If
ParsePath = strPart
ParsePath_End: Exit Function
End Function
Richiamando questa funzione dalla finestra Immediata essa restituisce “Test.txt”:
? ParsePath(&quot;C:TempTest.txt&quot;, opgParsePath.FILE_ONLY)
SEO by Artio
11 / 11