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 "t." ? Qualunque t??t ricerca carattere qualunque singolo parola di quattro-lettere che inizia e finisce con la "t.&quo # Qualunque 1#3 ricerca singolaqualunque cifra (0–9)numero di tre-cifre che inizia con 1 e finisce con "3." [elencocar] Qualunque [a-z] carattere ricerca qualunque singolo inlettera elencocar che cade tra "a" e "z" (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 "###-###-####" 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("vba", "VBA", 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("vba", "VBA", 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 "C:Temp" 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("This is a test", "t", 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 = "Ch07Err.txt" ' 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, "") ' 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, ".") > 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 = "" 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, ".") + 1, 3) Else strPart = "" End If Case Else strPart = "" End Select End If ParsePath = strPart ParsePath_End: Exit Function End Function Richiamando questa funzione dalla finestra Immediata essa restituisce “Test.txt”: ? ParsePath("C:TempTest.txt", opgParsePath.FILE_ONLY) SEO by Artio 11 / 11
Documenti analoghi
Select Case a più variabili
Select Case a più variabili - AccessGroup.it 2.0
Scritto da SV Salvino Crucitti
Mercoledì 17 Ottobre 2007 00:00 - Ultimo aggiornamento Mercoledì 28 Aprile 2010 15:16