Sto provando a scrivere una funzione VBA in Access che sostituisce le parole in un campo indirizzo con lo standard United States Postal Abbreviations. Mi rendo conto che questo non sarà mai perfetto, ma voglio almeno fare abbreviazioni semplici (senza dover acquistare software di formattazione degli indirizzi), ad es.Utilizzo di RegEx e Sostituisci per aggiornare i campi indirizzo con le abbreviazioni USPS in MS-Access
input output
------- -------------
North -> N
Street -> ST
Drive -> DR
Lane -> LN
ho pensato di utilizzare una semplice tabella per memorizzare la stringa e la stringa di sostituzione, e quindi scorrendo tale tabella/recordset per eseguire una semplice ricerca e sostituzione utilizzando la funzione Replace()
, esempio base alle immediate window
:
?Replace("123 North 3rd St", "North", "N", compare:=vbTextCompare)
123 N 3rd St
Tuttavia, questo metodo può potenzialmente causare errori, ad esempio
?Replace("123 Northampton St", "North", "N", compare:=vbTextCompare)
123 Nampton St
La mia strategia iniziale era quello di creare una tabella di sostituzione con modelli di espressioni regolari e stringhe di sostituzione, quindi collegare attraverso quel tavolo per fare una ricerca più precisa e sostituire.
pattern abbrev
------------------- ------------
{pattern for North} N
{pattern for Street} ST
ho capito che RegEx potrebbe essere eccessivo qui, soprattutto perché ho intenzione di essere scorrendo campi indirizzo più e più volte in un database, ma non riusciva a pensare a un modo più semplice usando solo la funzione Replace()
(Aggiornamento: vedere le risposte da @ mwolfe02 e @Cylian e una soluzione ibrida).
Nell'esempio precedente, voglio cercare le parole Nord e Street quando sono o come una parola in una stringa (separate da due spazi bianchi) o alla fine della stringa o all'inizio di una stringa. Questo copre la maggior parte delle situazioni che giustificano un'abbreviazione. ad es.
address formatted
---------------------- --------------------------
123 North 3rd St -> 123 N 3RD ST
123 ABC Street North -> 123 ABC ST N
North 3rd Street -> N 3RD ST
123 North Northampton St -> 123 N NORTHAMPTON ST
come in questi esempi, voglio sostituire tutte le istanze del modello nella stringa. Inoltre sto convertendo tutto in maiuscolo (posso usare UCase()
sul risultato finale senza problemi).
Qualcuno sa di un modulo esistente che fa questo genere di cose? Qualcuno può aiutare con il modello di corrispondenza come negli esempi di cui sopra? Per ulteriore credito, sono curioso anche di creare una regola nella tabella per la formattazione delle caselle postali, ad es.
address formatted
---------------------- --------------------------
P.O. Box 345 -> PO BOX 345
PO Box 345 -> PO BOX 345
Post Office Box 345 -> PO BOX 345
PO. Box 345 -> PO BOX 345
P. O. Box 345 -> PO BOX 345
This stack overflow post ha pronunciato la seguente modello di riconoscere alcune caselle postali "^ \ s * P.? \ S? O.? \ SB [Oo] [xx]." (certamente non il terzo esempio sopra). Ancora una volta, non mi sento a mio agio con i set di adattamento e sostituzione per capire come scrivere questa funzione di sostituzione più precisa. Esiste un esperto in RegEx/Access che può aiutare?
Al momento, sto riscontrando problemi nell'usare la funzione '' SubstituteUSPS() '' mentre faccio il giro della mia tabella sorgente. Non ho problemi con la funzione quando usato da solo; ma non sembra funzionare se combinato con un altro recordset. Idee? – regulus
L'ho capito. Dopo ogni passaggio, ho bisogno di ripristinare il recordset statico ** rst_abbrev ** nella prima posizione. Ho aggiornato il codice. – regulus