Próbuję napisać funkcję VBA w programie Access, który zastępuje słowa w polu adresu ze standardowym United States Postal Abbreviations. Rozumiem, że to nigdy nie będzie doskonałe, ale chcę przynajmniej wykonać proste skróty (bez konieczności zakupu oprogramowania do formatowania adresów), np. , np.przy użyciu regex i zamień zaktualizować pola adresowe z USPS skrótów w MS-Access
input output
------- -------------
North -> N
Street -> ST
Drive -> DR
Lane -> LN
Myślałem o użyciu prostą tabelę do przechowywania łańcuch i łańcuch zastępczy, a następnie zapętlenie poprzez rekordów tej tabeli/wykonać proste wyszukiwanie i zastąpić za pomocą funkcji Replace()
, np pomocą immediate window
z:
?Replace("123 North 3rd St", "North", "N", compare:=vbTextCompare)
123 N 3rd St
Jednakże, sposób ten może potencjalnie powodować błędy np
?Replace("123 Northampton St", "North", "N", compare:=vbTextCompare)
123 Nampton St
Moja oryginalna strategia była utworzyć tabelę zastępczą z regularnych wzorów ekspresji i ciągi zamiennych, następnie pętli tej tabeli zrobić dokładniejsze wyszukiwania i zamiany.
pattern abbrev
------------------- ------------
{pattern for North} N
{pattern for Street} ST
zdałem sobie sprawę, że może być przesadą RegEx tutaj, zwłaszcza, że mam zamiar zostać przelotowego pól adresowych w kółko w bazie danych, ale nie mógł myśleć o łatwiejszy sposób tylko przy użyciu funkcji Replace()
(Aktualizacja: zobacz odpowiedzi z @ mwolfe02 i @Cylian oraz rozwiązania hybrydowego).
W powyższym przykładzie chcę wyszukać słowa Północ i Ulica, gdy są one jako istniejące jako słowo w ciągu znaków (w ten sposób oddzielone dwoma białymi spacjami) lub na końcu ciągu lub początku strunowy. Obejmuje to większość sytuacji uzasadniających skrót. np.
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
jak w tych przykładach, chcę zastąpić wszystkie wystąpienia wzorca w łańcuchu. Konwertuję również wszystko na duże litery (mogę użyć UCase()
na końcowym wyniku bez problemu).
Czy ktoś wie o istniejącym module, który robi tego rodzaju rzeczy? Czy ktokolwiek może pomóc przy dopasowywaniu wzorców, jak w powyższych przykładach? Aby uzyskać dodatkowy kredyt, jestem ciekawy również tworzenia reguły w tabeli do formatowania skrzynek pocztowych, np. np.
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 daje następujący wzór rozpoznawać pewne pola po "^ \ s * s.? \ S? O.? \ SB [oo] [XX]." (wprawdzie nie trzeci przykład powyżej). Ponownie, nie jestem tak wygodne z zestawami dopasowania i wymiany, aby dowiedzieć się, jak napisać tę dokładniejszą funkcję zastępowania. Czy istnieje ekspert RegEx/Access, który może pomóc?
W tej chwili mam problem z używaniem funkcji 'SubstituteUSPS()' 'podczas przechodzenia przez moją tabelę źródłową. Nie mam żadnych problemów z funkcją, gdy jest używana samodzielnie; ale nie wydaje się działać w połączeniu z innym zestawem rekordów. Pomysły? – regulus
Wymyśliłem to. Po każdym przejściu muszę zresetować zestaw statyczny ** rst_abbrev ** na pierwszą pozycję. Zaktualizowałem kod. – regulus