पाठ से बाहर और घटकों में फ्रीफॉर्म स्ट्रीट / पोस्टल एड्रेस को पार्स कैसे करें


136

हम संयुक्त राज्य अमेरिका में बड़े पैमाने पर व्यापार करते हैं और सभी अनुभव क्षेत्रों को एक एकल पाठ क्षेत्र में जोड़कर उपयोगकर्ता अनुभव को बेहतर बनाने की कोशिश कर रहे हैं। लेकिन कुछ समस्याएं हैं:

  • उपयोगकर्ता के प्रकार का पता सही या मानक प्रारूप में नहीं हो सकता है
  • क्रेडिट कार्ड भुगतान को संसाधित करने के लिए पते को भागों (सड़क, शहर, राज्य आदि) में अलग किया जाना चाहिए
  • उपयोगकर्ता केवल अपने पते (जैसे कि उनके नाम या कंपनी के साथ) से अधिक दर्ज कर सकते हैं
  • Google ऐसा कर सकता है लेकिन सेवा की शर्तें और क्वेरी सीमाएं निषेधात्मक हैं, विशेष रूप से एक तंग बजट पर

जाहिर है, यह एक आम सवाल है:

क्या इसके चारों ओर के पाठ से एक पते को अलग करने और इसे टुकड़ों में तोड़ने का एक तरीका है? क्या पतों को पार्स करने के लिए एक नियमित अभिव्यक्ति है?


नीचे दिए गए उत्तर अधिक उपयोगी हैं क्योंकि वे वैश्विक समस्या को अनदेखा नहीं करते हैं - जो पते एक सामान्य पैटर्न में फिट नहीं होते हैं।
मार्क मैक्समिस्टर

जवाबों:


290

जब मैंने एड्रेस वेरिफिकेशन कंपनी के लिए काम किया तो मुझे यह सवाल बहुत अच्छा लगा। मैं इसका उत्तर यहाँ पोस्ट कर रहा हूँ ताकि यह उन प्रोग्रामरों के लिए और अधिक सुलभ हो सके जो एक ही प्रश्न के साथ खोज रहे हैं। मैं जिस कंपनी में था, उसके पास अरबों के पते थे, और हमने इस प्रक्रिया में बहुत कुछ सीखा।

पहले, हमें पतों के बारे में कुछ बातें समझने की जरूरत है।

पते नियमित नहीं हैं

इसका मतलब है कि नियमित अभिव्यक्ति बाहर हैं। मैंने यह सब देखा है, साधारण नियमित अभिव्यक्तियों से जो कि एक बहुत ही विशिष्ट प्रारूप में पते से मेल खाते हैं, इस के लिए:

/ \ S + (\ घ {2,5} \ s +) ([एक | p]?! मीटर \ ख) (([a-zA-जेड | \ s +] {1,5}) {1,2}) ([\ s |, |।] +) (([a-zA-जेड | \ s +] {1,30}) {1,4})? (अदालत | सीटी | सड़क | सेंट | ड्राइव | डॉ | लेन | ln | सड़क | वां | blvd) ([\ s |, | |;।]? +) (([a-zA-जेड | \ s +] {1,30}) {1,2}) ([ \ रों |, |।] +) \ ख (ए |? AL | एआर | AZ | सीए | सीओ | सीटी | डीसी | डे | FL | जीए | GU | HI | आइए | आईडी | आईएल | IN | केएस | KY | ला | एमए | एमडी | ME | एमआई | MN | एमओ | एमएस | मीट्रिक टन | एनसी | एन डी | NE | एनएच | न्यू जर्सी | समुद्री मील दूर | NV | न्यूयॉर्क | ओह | ठीक | या | पीए | आरआई | अनुसूचित जाति | एसडी | तमिलनाडु | TX | केन्द्र शासित प्रदेशों | वीए | छठी | वीटी | वाशिंगटन | WI | WV | WY) ([\ s |, |।] +) (\ s + \ घ {5}) ([\ s |, |।]? +) / i

... यह करने के लिए जहां 900+ लाइन-क्लास फ़ाइल मक्खी पर एक सुपरमैसिव रेगुलर एक्सप्रेशन उत्पन्न करती है, और भी अधिक मेल खाने के लिए। मैं इनकी अनुशंसा नहीं करता (उदाहरण के लिए, यहां उपरोक्त रेगेक्स का एक बेड़ा है, जो बहुत सारी गलतियाँ करता है )। यह काम करने के लिए एक आसान जादू फार्मूला नहीं है। सिद्धांत रूप में और द्वारा सिद्धांत, यह एक नियमित अभिव्यक्ति के साथ पतों का मिलान करने के लिए संभव नहीं है।

यूएसपीएस पब्लिकेशन 28 उन सभी पतों के कई स्वरूपों का दस्तावेज बनाता है जो उनके सभी कीवर्ड और वैरिएंट के साथ संभव हैं। सबसे खराब, पते अक्सर अस्पष्ट होते हैं। शब्दों का एक से अधिक अर्थ हो सकता है ("सेंट" "सेंट" या "स्ट्रीट" हो सकता है) और ऐसे शब्द हैं जो मुझे यकीन है कि उन्होंने आविष्कार किया था। (कौन जानता था कि "स्ट्रैटन" एक सड़क प्रत्यय था?)

आपको कुछ कोड की आवश्यकता होगी जो वास्तव में पते को समझते हैं, और यदि वह कोड मौजूद है, तो यह एक व्यापार रहस्य है। लेकिन अगर आप वास्तव में हैं तो आप अपना रोल खुद बना सकते हैं।

पते अप्रत्याशित आकार और आकार में आते हैं

यहाँ कुछ वंचित (लेकिन पूर्ण) पते दिए गए हैं:

1)  102 main street
    Anytown, state

2)  400n 600e #2, 52173

3)  p.o. #104 60203

यहां तक ​​कि ये संभवतः मान्य हैं:

4)  829 LKSDFJlkjsdflkjsdljf Bkpw 12345

5)  205 1105 14 90210

जाहिर है, ये मानकीकृत नहीं हैं। विराम चिह्न और पंक्ति विराम की गारंटी नहीं है। यहाँ क्या हो रहा है:

  1. नंबर 1 पूरा हो गया है क्योंकि इसमें सड़क का पता और शहर और राज्य शामिल हैं। उस जानकारी के साथ, पते की पर्याप्त पहचान है, और इसे "सुपुर्दगी" (कुछ मानकीकरण के साथ) माना जा सकता है।

  2. नंबर 2 पूरा हो गया है क्योंकि इसमें एक सड़क का पता (द्वितीयक / यूनिट संख्या के साथ) और 5 अंकों का ज़िप कोड है, जो एक पते की पहचान करने के लिए पर्याप्त है।

  3. नंबर 3 एक पूर्ण पोस्ट ऑफिस बॉक्स प्रारूप है, क्योंकि यह एक ज़िप कोड है।

  4. नंबर 4 भी पूरा है क्योंकि ज़िप कोड अद्वितीय है , जिसका अर्थ है कि एक निजी संस्था या निगम ने उस पता स्थान को खरीदा है। एक अद्वितीय ज़िप कोड उच्च-मात्रा या केंद्रित वितरण स्थानों के लिए है। ज़िप कोड 12345 को संबोधित कुछ भी जनरल इलेक्ट्रिक में शेंक्टाडी, एनवाई में जाता है। यह उदाहरण विशेष रूप से किसी तक नहीं पहुंचेगा, लेकिन यूएसपीएस अभी भी इसे वितरित करने में सक्षम होगा।

  5. नंबर 5 भी पूरा है, मानो या न मानो। बस उन नंबरों के साथ, सभी संभावित पतों के डेटाबेस के खिलाफ पार्स किए जाने पर पूरा पता खोजा जा सकता है। जब आप प्रत्येक घटक को एक घटक के रूप में देखते हैं, तो लापता दिशात्मक, माध्यमिक डिज़ाइनर और ज़िप + 4 कोड में भरना तुच्छ होता है। यहाँ यह कैसा दिखता है, पूरी तरह से विस्तारित और मानकीकृत है:

205 एन 1105 डब्ल्यू एप्ट 14

बेवर्ली हिल्स CA 90210-5221

पता डेटा आपका अपना नहीं है

अधिकांश देशों में जो लाइसेंस प्राप्त विक्रेताओं को आधिकारिक पता डेटा प्रदान करते हैं, पता डेटा स्वयं गवर्निंग एजेंसी के हैं। अमेरिका में, USPS पते के मालिक हैं। कनाडा पोस्ट, रॉयल मेल और अन्य लोगों के लिए भी यही सच है, हालांकि प्रत्येक देश स्वामित्व को थोड़ा अलग तरीके से लागू या परिभाषित करता है। यह जानना महत्वपूर्ण है, क्योंकि यह आमतौर पर एड्रेस डेटाबेस को रिवर्स-इंजीनियरिंग करने से मना करता है। आपको सावधान रहना होगा कि डेटा का अधिग्रहण, भंडारण और उपयोग कैसे करें।

Google मैप्स त्वरित पता सुधारों के लिए एक आम जाना है, लेकिन टीओएस बल्कि निषेधात्मक है; उदाहरण के लिए, आप बिना Google मानचित्र दिखाए, और केवल (जब तक आप भुगतान नहीं करते हैं) के लिए आप उनके डेटा या एपीआई का उपयोग नहीं कर सकते, और आप डेटा (अस्थायी कैशिंग को छोड़कर) संग्रहीत नहीं कर सकते। समझ में आता है। Google का डेटा दुनिया में सबसे अच्छा है। हालाँकि, Google मैप्स पते को सत्यापित नहीं करता है । यदि कोई पता मौजूद नहीं है, तो यह तब भी आपको दिखाएगा कि पता कहाँ होगा यदि यह मौजूद था (अपनी खुद की सड़क पर प्रयास करें; एक घर संख्या का उपयोग करें जो आपको पता है कि मौजूद नहीं है)। यह कभी-कभी उपयोगी होता है, लेकिन इसके बारे में जागरूक रहें।

Nominatim की उपयोग नीति समान रूप से सीमित है, विशेष रूप से उच्च मात्रा और व्यावसायिक उपयोग के लिए, और डेटा ज्यादातर मुक्त स्रोतों से तैयार किया गया है, इसलिए यह उतना ही बनाए नहीं रखा जाता है (जैसे कि खुली परियोजनाओं की प्रकृति) - हालांकि, यह अभी भी सूट कर सकता है आपकी ज़रूरतें। यह एक महान समुदाय द्वारा समर्थित है।

यूएसपीएस में स्वयं एक एपीआई है, लेकिन यह बहुत नीचे चला जाता है और न तो गारंटी के साथ आता है और न ही समर्थन करता है। इसका उपयोग करना कठिन भी हो सकता है। कुछ लोग इसका इस्तेमाल बिना किसी समस्या के करते हैं। लेकिन यह याद रखना आसान है कि यूएसपीएस के लिए आवश्यक है कि आप उनके एपीआई का उपयोग केवल उनके माध्यम से जहाज भेजने के पतों की पुष्टि के लिए करें।

लोगों को उम्मीद है कि पते कठिन होंगे

दुर्भाग्य से, हमने अपने समाज को जटिल होने वाले पतों की अपेक्षा करने के लिए वातानुकूलित किया है। इस बारे में इंटरनेट पर दर्जनों अच्छे यूएक्स लेख हैं, लेकिन तथ्य यह है, यदि आपके पास अलग-अलग क्षेत्रों के साथ एक पते का फॉर्म है, तो वही है जो उपयोगकर्ता अपेक्षा करते हैं, भले ही यह किनारे के पते के लिए कठिन हो, जो फिट नहीं होते हैं फ़ॉर्मेट की अपेक्षा की जा रही है, या हो सकता है कि फ़ॉर्म को ऐसे फ़ील्ड की आवश्यकता हो जो इसे नहीं करना चाहिए। या उपयोगकर्ताओं को पता नहीं है कि उनके पते का एक निश्चित हिस्सा कहां रखा जाए।

मैं इन दिनों चेकआउट फॉर्म के खराब यूएक्स के बारे में और आगे बढ़ सकता हूं, लेकिन इसके बजाय मैं सिर्फ इतना कहूंगा कि पते को एक ही क्षेत्र में जोड़ना एक स्वागत योग्य बदलाव होगा - लोग अपना पता टाइप करने में सक्षम होंगे कि वे कैसे फिट दिखते हैं , बल्कि अपने लंबे रूप का पता लगाने की कोशिश कर रहा है। हालाँकि, यह परिवर्तन अप्रत्याशित होगा और उपयोगकर्ताओं को पहले यह थोड़ा परेशान लग सकता है। बस उस के बारे में पता होना चाहिए।

संबोधन से पहले देश के मैदान को सामने रखकर इस दर्द को कम किया जा सकता है। जब वे पहले देश के क्षेत्र को भरते हैं, तो आप जानते हैं कि अपने फॉर्म को कैसे प्रदर्शित किया जाए। हो सकता है कि आपके पास एकल-फ़ील्ड यूएस पतों से निपटने का एक अच्छा तरीका है, इसलिए यदि वे संयुक्त राज्य का चयन करते हैं, तो आप अपने फॉर्म को एकल फ़ील्ड में कम कर सकते हैं, अन्यथा घटक फ़ील्ड दिखाएं। बस सोचने वाली बातें!

अब हम जानते हैं कि यह कठिन क्यों है; आप इसके बारे में क्या कर सकते हैं?

USPS विक्रेताओं को ग्राहकों को सत्यापित पते प्रदान करने के लिए CASS ™ प्रमाणन नामक एक प्रक्रिया के माध्यम से लाइसेंस प्रदान करता है। इन विक्रेताओं के पास यूएसपीएस डेटाबेस तक पहुंच है, मासिक अद्यतन किया गया है। उनके सॉफ़्टवेयर को प्रमाणित होने के लिए कठोर मानकों के अनुरूप होना चाहिए, और उन्हें अक्सर ऐसे सीमित शब्दों में समझौते की आवश्यकता नहीं होती है जैसा कि ऊपर चर्चा की गई है।

कई CASS- प्रमाणित कंपनियां हैं जो सूचियों की प्रक्रिया कर सकती हैं या एपीआई कर सकती हैं: मेलिसा डेटा, एक्सपेरिमेंट QAS और SmartyStreets कुछ नाम।

("विज्ञापन" के लिए फ्लैक मिलने के कारण मैंने इस बिंदु पर अपना जवाब छोटा कर दिया है। यह आपके लिए एक समाधान है जो आपके लिए काम करता है।)

सच: सच, दोस्तों, मैं इनमें से किसी भी कंपनी में काम नहीं करता। यह एक विज्ञापन नहीं है।


1
दक्षिण अमेरिकी (उरुग्वे) के पते के बारे में क्या? : D
बार्ट कैलिक्सो

11
@ ब्रायन - शायद क्योंकि उपयोगकर्ता ने सवाल और जवाब पढ़ने वालों के लिए बहुत उपयोगी जानकारी प्रदान की है, भले ही वे अपनी कंपनी के उत्पाद का उपयोग करें या नहीं।
ज़रीफेथ

7
@Brian वे साइटें सामग्री स्क्रेपर्स हैं। वे SERP रैंकिंग पाने के लिए सामग्री का उपयोग कर रहे हैं। मैंने उन्हें पहले कभी नहीं देखा। मैंने इस सामग्री को पहले या कहीं और बाद में पोस्ट नहीं किया है।
मैट

2
@khuderm मैंने अभी देखा जब मैंने आपकी टिप्पणी पढ़ी कि सभी असंतुष्ट टिप्पणियां गायब हो गई हैं; निश्चित नहीं है कि कैसे / कब हुआ। लेकिन फिर भी, मेरे उत्तर के इतिहास को देखें और आपको एक अमेरिकी पता निकालने वाले का सीधा संदर्भ मिलेगा जो आपकी मदद कर सकता है। मैंने इसे तब बनाया था जब मैंने अपनी पिछली नौकरी में काम किया था, लेकिन यह मालिकाना कोड है इसलिए मैं इसे साझा नहीं कर सकता ... लेकिन वे मौजूद हैं। उम्मीद है कि सहायक है।
मैट

2
उफ़। क्षमा करें @Matt। खैर मैंने आपके सवालों के माध्यम से आपका अनुसरण करना शुरू कर दिया है और जीथब ने भी। काफी प्रभावशाली तुम हो।
सायका

28

libpostal: पतों को पार्स करने के लिए एक ओपन-सोर्स लाइब्रेरी, OpenStreetMap, OpenAddresses और OpenCage से डेटा के साथ प्रशिक्षण।

https://github.com/openvenues/libpostal ( इसके बारे में अधिक जानकारी )

अन्य उपकरण / सेवाएं:


13

कई स्ट्रीट एड्रेस पार्सर हैं। वे दो मूल स्वादों में आते हैं - जिनके स्थान के नाम और सड़क के नाम के डेटाबेस हैं, और जो नहीं हैं।

एक रेगुलर एक्सप्रेशन स्ट्रीट एड्रेस पार्सर बिना किसी परेशानी के लगभग 95% सफलता दर तक प्राप्त कर सकता है। फिर आप असामान्य मामलों को मारना शुरू करते हैं। सीपीएल में पर्ल वन, "जियो :: स्ट्रीटएड्रेस :: यूएस", उस अच्छे के बारे में है। उस के सभी खुले स्रोत पायथन और जावास्क्रिप्ट पोर्ट हैं। मेरे पास पायथन में एक बेहतर संस्करण है जो अधिक मामलों को संभालकर सफलता की दर को थोड़ा बढ़ा देता है। अंतिम 3% अधिकार प्राप्त करने के लिए, हालांकि, आपको अवहेलना के साथ मदद करने के लिए डेटाबेस की आवश्यकता होती है।

3-अंकों वाले ज़िप कोड और अमेरिकी राज्य के नाम और संक्षिप्त नाम के साथ एक डेटाबेस एक बड़ी मदद है। जब एक पार्सर एक सुसंगत डाक कोड और राज्य का नाम देखता है, तो यह प्रारूप पर लॉक करना शुरू कर सकता है। यह अमेरिका और ब्रिटेन के लिए बहुत अच्छा काम करता है।

उचित सड़क का पता पार्सिंग अंत से शुरू होता है और पीछे की ओर काम करता है। यह यूएसपीएस सिस्टम कैसे करता है। पते अंत में कम से कम अस्पष्ट होते हैं, जहां देश के नाम, शहर के नाम और डाक कोड अपेक्षाकृत आसान होते हैं। स्ट्रीट नामों को आमतौर पर अलग किया जा सकता है। सड़कों पर स्थान पार्स करने के लिए सबसे जटिल हैं; वहां आप "फिफ्थ फ्लोर" और "स्टेपल्स पैविलियन" जैसी चीजों का सामना करते हैं। जब एक डेटाबेस एक बड़ी मदद है।


CPAN मॉड्यूल लिंगुआ: EN :: AddressParse भी है। जबकि "जियो :: स्ट्रीटएड्रेस :: यूएस" की तुलना में धीमी गति से, यह एक उच्च सफलता दर देता है।
किम रयान

8

अद्यतन: Geocode.xyz अब दुनिया भर में काम करता है। उदाहरणों के लिए https://geocode.xyz देखें

संयुक्त राज्य अमेरिका, मैक्सिको और कनाडा के लिए, जियोकोडर.का देखें ।

उदाहरण के लिए:

इनपुट: मुख्य और आर्थर किल आरडी न्यू यॉर्क के चौराहे के पास कुछ चल रहा है

आउटपुट:

<geodata>
  <latt>40.5123510000</latt>
  <longt>-74.2500500000</longt>
  <AreaCode>347,718</AreaCode>
  <TimeZone>America/New_York</TimeZone>
  <standard>
    <street1>main</street1>
    <street2>arthur kill</street2>
    <stnumber/>
    <staddress/>
    <city>STATEN ISLAND</city>
    <prov>NY</prov>
    <postal>11385</postal>
    <confidence>0.9</confidence>
  </standard>
</geodata>

आप वेब इंटरफ़ेस में परिणाम भी देख सकते हैं या Json या Jsonp के रूप में आउटपुट प्राप्त कर सकते हैं। जैसे। मैं 123 मेन स्ट्रीट, न्यूयॉर्क के आसपास के रेस्तरां ढूंढ रहा हूं


आपने ओपनड्रेस का उपयोग करते हुए एड्रेस पार्सिंग सिस्टम को कैसे लागू किया? क्या आप जानवर बल की रणनीति का उपयोग कर रहे हैं?
नितिन के अनिल

1
'पाशविक बल' से आपका क्या तात्पर्य है? संभावित एड्रेस स्ट्रिंग्स के सभी संभावित संयोजनों में टेक्स्ट को तोड़ना और पते के एक डेटाबेस के खिलाफ हर एक की तुलना करना व्यावहारिक नहीं है और इस प्रणाली की तुलना में उत्तर देने में अधिक समय लगेगा। Openaddresses एल्गोरिथ्म के लिए पता प्रारूपों के 'प्रशिक्षण सेट' के निर्माण के लिए डेटा स्रोतों में से एक है। यह इस जानकारी का उपयोग बिना पढ़े हुए पाठ के पतों को पार्स करने के लिए करता है।
एर्विन रूसी

2
इसी तरह की एक और प्रणाली है जियो :: लिबपोस्टल ( perltricks.com/article/announcing-geo--libpostal ) वे फ्लाईस्ट पर एड्रेस टेम्प्लेट बनाने के लिए ओपनस्ट्रीटैम्प और ओपनड्रेस्रेस का भी इस्तेमाल करते हैं
एर्विन रूसी

मैंने अभी सैकड़ों वास्तविक पतों पर geocode.xyz के जियोपरर (पाठ में पाठ, वापस स्थान प्राप्त करें) का परीक्षण किया। गूगल मानचित्र के एपीआई के साथ कंधे से एक पक्ष है, और पतों की एक वैश्विक सेट को देखते हुए geocode.xyzकी scantextविधि समय के सबसे असफल रहा। इसने हमेशा "जेनेवा, स्विटज़रलैंड" के ऊपर "जिनेवा, यूएस" चुना और आमतौर पर अमेरिका का पक्षपाती था।
मार्क मैक्समिस्टर

ये संदर्भ पर निर्भर करता है। geocode.xyz/?scantext=Geneva,%20Sw स्विटज़रलैंड उत्पादन करेगा: मैच स्थान जिनेवा, स्विट्जरलैंड, CH कॉन्फिडेंस स्कोर: 0.8 जबकि geocode.xyz/?scantext=Geneva,%20SA मैच स्थान जिनेवा, यूएस कॉन्फिडेंस स्कोर का उत्पादन करेगा: 1.0 इसके अलावा,। आप निम्नानुसार पूर्वाग्रह कर सकते हैं: geocode.xyz/?scantext=Geneva,%20USA®ion=CH
Ervin Ruci

4

कोई कोड नहीं? शर्म की बात है!

यहाँ एक सरल जावास्क्रिप्ट पता पार्सर है। यह हर एक कारण से बहुत भयानक है जो मैट अपने शोध प्रबंध में देता है (जो कि मैं लगभग 100% सहमत हूं: पते जटिल प्रकार हैं, और मनुष्य गलतियाँ करते हैं; इसे आउटसोर्स करने और इसे स्वचालित करने के लिए बेहतर है - जब आप बर्दाश्त कर सकते हैं)।

लेकिन रोने के बजाय, मैंने कोशिश करने का फैसला किया:

इस कोड के लिए सबसे Esri परिणाम पार्स करने के लिए ठीक काम करता हैfindAddressCandidateऔर कुछ अन्य (रिवर्स) जियोकोडर्स के साथ भी जो सिंगल-लाइन एड्रेस लौटाते हैं, जहां सड़क / शहर / राज्य अल्पविराम द्वारा सीमांकित होते हैं। यदि आप चाहते हैं या देश-विशिष्ट पार्सर्स लिख सकते हैं, तो आप विस्तार कर सकते हैं। या सिर्फ इस अध्ययन के मामले के रूप में इसका उपयोग करें कि यह अभ्यास कितना चुनौतीपूर्ण हो सकता है या मैं जावास्क्रिप्ट में कितना घटिया हूं। मैं मानता हूं कि मैंने केवल इस पर लगभग तीस मिनट बिताए (भविष्य के पुनरावृत्तियों में कैश, ज़िप सत्यापन और राज्य लुकअप के साथ-साथ उपयोगकर्ता स्थान संदर्भ भी शामिल हो सकते हैं), लेकिन इसने मेरे उपयोग के मामले में काम किया: अंतिम उपयोगकर्ता प्रपत्र 4 में पार्स जियोडोड खोज प्रतिक्रिया देखता है बक्सें। यदि पता पार्स करना गलत है (जो स्रोत डेटा खराब होने तक दुर्लभ है) यह कोई बड़ी बात नहीं है - उपयोगकर्ता इसे सत्यापित करने और ठीक करने के लिए जाता है! (लेकिन स्वचालित समाधानों के लिए त्रुटि के रूप में या तो अनदेखा / अनदेखा या ध्वजांकित कर सकते हैं ताकि देव या तो नए प्रारूप का समर्थन कर सकें या स्रोत डेटा को ठीक कर सकें।)

/* 
address assumptions:
- US addresses only (probably want separate parser for different countries)
- No country code expected.
- if last token is a number it is probably a postal code
-- 5 digit number means more likely
- if last token is a hyphenated string it might be a postal code
-- if both sides are numeric, and in form #####-#### it is more likely
- if city is supplied, state will also be supplied (city names not unique)
- zip/postal code may be omitted even if has city & state
- state may be two-char code or may be full state name.
- commas: 
-- last comma is usually city/state separator
-- second-to-last comma is possibly street/city separator
-- other commas are building-specific stuff that I don't care about right now.
- token count:
-- because units, street names, and city names may contain spaces token count highly variable.
-- simplest address has at least two tokens: 714 OAK
-- common simple address has at least four tokens: 714 S OAK ST
-- common full (mailing) address has at least 5-7:
--- 714 OAK, RUMTOWN, VA 59201
--- 714 S OAK ST, RUMTOWN, VA 59201
-- complex address may have a dozen or more:
--- MAGICICIAN SUPPLY, LLC, UNIT 213A, MAGIC TOWN MALL, 13 MAGIC CIRCLE DRIVE, LAND OF MAGIC, MA 73122-3412
*/

var rawtext = $("textarea").val();
var rawlist = rawtext.split("\n");

function ParseAddressEsri(singleLineaddressString) {
  var address = {
    street: "",
    city: "",
    state: "",
    postalCode: ""
  };

  // tokenize by space (retain commas in tokens)
  var tokens = singleLineaddressString.split(/[\s]+/);
  var tokenCount = tokens.length;
  var lastToken = tokens.pop();
  if (
    // if numeric assume postal code (ignore length, for now)
    !isNaN(lastToken) ||
    // if hyphenated assume long zip code, ignore whether numeric, for now
    lastToken.split("-").length - 1 === 1) {
    address.postalCode = lastToken;
    lastToken = tokens.pop();
  }

  if (lastToken && isNaN(lastToken)) {
    if (address.postalCode.length && lastToken.length === 2) {
      // assume state/province code ONLY if had postal code
      // otherwise it could be a simple address like "714 S OAK ST"
      // where "ST" for "street" looks like two-letter state code
      // possibly this could be resolved with registry of known state codes, but meh. (and may collide anyway)
      address.state = lastToken;
      lastToken = tokens.pop();
    }
    if (address.state.length === 0) {
      // check for special case: might have State name instead of State Code.
      var stateNameParts = [lastToken.endsWith(",") ? lastToken.substring(0, lastToken.length - 1) : lastToken];

      // check remaining tokens from right-to-left for the first comma
      while (2 + 2 != 5) {
        lastToken = tokens.pop();
        if (!lastToken) break;
        else if (lastToken.endsWith(",")) {
          // found separator, ignore stuff on left side
          tokens.push(lastToken); // put it back
          break;
        } else {
          stateNameParts.unshift(lastToken);
        }
      }
      address.state = stateNameParts.join(' ');
      lastToken = tokens.pop();
    }
  }

  if (lastToken) {
    // here is where it gets trickier:
    if (address.state.length) {
      // if there is a state, then assume there is also a city and street.
      // PROBLEM: city may be multiple words (spaces)
      // but we can pretty safely assume next-from-last token is at least PART of the city name
      // most cities are single-name. It would be very helpful if we knew more context, like
      // the name of the city user is in. But ignore that for now.
      // ideally would have zip code service or lookup to give city name for the zip code.
      var cityNameParts = [lastToken.endsWith(",") ? lastToken.substring(0, lastToken.length - 1) : lastToken];

      // assumption / RULE: street and city must have comma delimiter
      // addresses that do not follow this rule will be wrong only if city has space
      // but don't care because Esri formats put comma before City
      var streetNameParts = [];

      // check remaining tokens from right-to-left for the first comma
      while (2 + 2 != 5) {
        lastToken = tokens.pop();
        if (!lastToken) break;
        else if (lastToken.endsWith(",")) {
          // found end of street address (may include building, etc. - don't care right now)
          // add token back to end, but remove trailing comma (it did its job)
          tokens.push(lastToken.endsWith(",") ? lastToken.substring(0, lastToken.length - 1) : lastToken);
          streetNameParts = tokens;
          break;
        } else {
          cityNameParts.unshift(lastToken);
        }
      }
      address.city = cityNameParts.join(' ');
      address.street = streetNameParts.join(' ');
    } else {
      // if there is NO state, then assume there is NO city also, just street! (easy)
      // reasoning: city names are not very original (Portland, OR and Portland, ME) so if user wants city they need to store state also (but if you are only ever in Portlan, OR, you don't care about city/state)
      // put last token back in list, then rejoin on space
      tokens.push(lastToken);
      address.street = tokens.join(' ');
    }
  }
  // when parsing right-to-left hard to know if street only vs street + city/state
  // hack fix for now is to shift stuff around.
  // assumption/requirement: will always have at least street part; you will never just get "city, state"  
  // could possibly tweak this with options or more intelligent parsing&sniffing
  if (!address.city && address.state) {
    address.city = address.state;
    address.state = '';
  }
  if (!address.street) {
    address.street = address.city;
    address.city = '';
  }

  return address;
}

// get list of objects with discrete address properties
var addresses = rawlist
  .filter(function(o) {
    return o.length > 0
  })
  .map(ParseAddressEsri);
$("#output").text(JSON.stringify(addresses));
console.log(addresses);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea>
27488 Stanford Ave, Bowden, North Dakota
380 New York St, Redlands, CA 92373
13212 E SPRAGUE AVE, FAIR VALLEY, MD 99201
1005 N Gravenstein Highway, Sebastopol CA 95472
A. P. Croll &amp; Son 2299 Lewes-Georgetown Hwy, Georgetown, DE 19947
11522 Shawnee Road, Greenwood, DE 19950
144 Kings Highway, S.W. Dover, DE 19901
Intergrated Const. Services 2 Penns Way Suite 405, New Castle, DE 19720
Humes Realty 33 Bridle Ridge Court, Lewes, DE 19958
Nichols Excavation 2742 Pulaski Hwy, Newark, DE 19711
2284 Bryn Zion Road, Smyrna, DE 19904
VEI Dover Crossroads, LLC 1500 Serpentine Road, Suite 100 Baltimore MD 21
580 North Dupont Highway, Dover, DE 19901
P.O. Box 778, Dover, DE 19903
714 S OAK ST
714 S OAK ST, RUM TOWN, VA, 99201
3142 E SPRAGUE AVE, WHISKEY VALLEY, WA 99281
27488 Stanford Ave, Bowden, North Dakota
380 New York St, Redlands, CA 92373
</textarea>
<div id="output">
</div>


अस्वीकरण: मेरे ग्राहक अपने पते के डेटा के स्वामी हैं और अपने स्वयं के एस्री सर्वर चलाते हैं। यदि आप Google, OSM, ArcGisOnline या जहाँ कहीं भी डेटा लेते हैं, यह सुनिश्चित करें कि इसे स्टोर करना और इसका उपयोग करना ठीक है (कई सेवाओं पर प्रतिबंध है कि आप कैसे स्टोर कर सकते हैं, और कितनी देर तक)
कुछ भी नहीं

यदि आप एक वैश्विक पते की सूची के साथ काम कर रहे हैं तो पहला जवाब एक सम्मोहक मामला बनाता है कि यह समस्या रीगेक्स के साथ असाध्य है। 200 देशों में बहुत अधिक अपवाद हैं। मेरे परीक्षण में, आप मज़बूती से देश को एक स्ट्रिंग से निर्धारित कर सकते हैं, फिर प्रत्येक देश के लिए एक विशिष्ट रेगीक्स देखें - जो कि शायद बेहतर एपीआई कैसे काम करता है।
मार्क मैक्समिस्टर

2

यदि आप OSM डेटा पर भरोसा करना चाहते हैं तो libpostal बहुत शक्तिशाली है और एड्रेस इनपुट के साथ बहुत सारे सामान्य कैविटीज़ को हैंडल करता है।


मुझे लगता है कि आपका जवाब इस पोस्ट का डुप्लिकेट है अच्छा सुझाव है, हालांकि।
माइकल

2

यूएस आधारित पतों का एक अन्य विकल्प YAddress (कंपनी द्वारा मेरे लिए काम किया जाता है) है।

इस सवाल के कई जवाब एक समाधान के रूप में जियोकोडिंग टूल का सुझाव देते हैं। पता पार्सिंग और जियोकोडिंग को भ्रमित न करना महत्वपूर्ण है; वे एक जैसे नहीं हैं। हालांकि जियोकोडर्स एक पक्ष को लाभ के रूप में घटकों में एक पते को तोड़ सकते हैं, वे आमतौर पर गैर-मानक पते सेट पर भरोसा करते हैं। इसका मतलब यह है कि जियोकोडर-पार्स किया गया पता आधिकारिक पते के समान नहीं हो सकता है। उदाहरण के लिए, Google जियोकोडिंग एपीआई मैनहट्टन में "6th एवेन्यू" को क्या कहता है, यूएसपीएस "एवेन्यू ऑफ द अमेरिका" कहता है।


2

यूएस एड्रेस पार्सिंग के लिए,

मैं usaddress पैकेज का उपयोग करना पसंद करता हूं जो कि usaddress के लिए पाइप में उपलब्ध है

python3 -m pip install usaddress

प्रलेखन
PyPi

इसने यूएस एड्रेस के लिए मेरे लिए अच्छा काम किया।

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# address_parser.py
import sys
from usaddress import tag
from json import dumps, loads

if __name__ == '__main__':
    tag_mapping = {
        'Recipient': 'recipient',
        'AddressNumber': 'addressStreet',
        'AddressNumberPrefix': 'addressStreet',
        'AddressNumberSuffix': 'addressStreet',
        'StreetName': 'addressStreet',
        'StreetNamePreDirectional': 'addressStreet',
        'StreetNamePreModifier': 'addressStreet',
        'StreetNamePreType': 'addressStreet',
        'StreetNamePostDirectional': 'addressStreet',
        'StreetNamePostModifier': 'addressStreet',
        'StreetNamePostType': 'addressStreet',
        'CornerOf': 'addressStreet',
        'IntersectionSeparator': 'addressStreet',
        'LandmarkName': 'addressStreet',
        'USPSBoxGroupID': 'addressStreet',
        'USPSBoxGroupType': 'addressStreet',
        'USPSBoxID': 'addressStreet',
        'USPSBoxType': 'addressStreet',
        'BuildingName': 'addressStreet',
        'OccupancyType': 'addressStreet',
        'OccupancyIdentifier': 'addressStreet',
        'SubaddressIdentifier': 'addressStreet',
        'SubaddressType': 'addressStreet',
        'PlaceName': 'addressCity',
        'StateName': 'addressState',
        'ZipCode': 'addressPostalCode',
    }
    try:
        address, _ = tag(' '.join(sys.argv[1:]), tag_mapping=tag_mapping)
    except:
        with open('failed_address.txt', 'a') as fp:
            fp.write(sys.argv[1] + '\n')
        print(dumps({}))
    else:
        print(dumps(dict(address)))

Address_parser.py चल रहा है

 python3 address_parser.py 9757 East Arcadia Ave. Saugus MA 01906
 {"addressStreet": "9757 East Arcadia Ave.", "addressCity": "Saugus", "addressState": "MA", "addressPostalCode": "01906"}

0

हमारे एक प्रोजेक्ट में हमने निम्नलिखित एड्रेस पार्सर का उपयोग किया है। यह अच्छी सटीकता के साथ दुनिया के अधिकांश देशों के पते को पार्स करता है।

http://address-parser.net/

यह स्टैंड अलोन लाइब्रेरी या लाइव एपीआई के रूप में उपलब्ध है।


1
लेकिन यह उत्पाद के लिए एक भुगतान है।
जेरेमी थॉम्पसन

0

मुझे पार्टी के लिए देर हो रही है, यहाँ एक एक्सेल VBA स्क्रिप्ट है जो मैंने वर्षों पहले ऑस्ट्रेलिया के लिए लिखा था। इसे आसानी से अन्य देशों का समर्थन करने के लिए संशोधित किया जा सकता है। मैंने यहाँ C # कोड का GitHub रिपॉजिटरी बनाया है। मैंने इसे अपनी साइट पर होस्ट किया है और आप इसे यहाँ डाउनलोड कर सकते हैं: http://jeremythompson.net/rocks/ParseAddress.xlsm

रणनीति

किसी पोस्टकोड के साथ किसी भी देश के लिए जो संख्यात्मक है या एक RegEx के साथ मिलान किया जा सकता है मेरी रणनीति बहुत अच्छी तरह से काम करती है:

  1. पहले हम फर्स्ट और सरनेम का पता लगाते हैं जिन्हें शीर्ष रेखा माना जाता है। नाम को छोड़ना और चेकबॉक्स को अनचाहे पते से शुरू करना आसान है (जिसे 'शीर्ष पंक्ति कहा जाता है' जैसा कि नीचे दिखाया गया है)।

  2. स्ट्रीट और नंबर से संबंधित पते की उम्मीद करने के लिए इसकी सुरक्षित अगली, उपनगर और सेंट से पहले आती है, Pde, Ave, Av, Rd, Cres, loop, आदि एक विभाजक है।

  3. राज्य और यहां तक ​​कि देश को उपनगर का पता लगाना सबसे परिष्कृत पार्सर्स को चकमा दे सकता है क्योंकि संघर्ष हो सकता है। इसे दूर करने के लिए मैं पोस्टकोड लुक का उपयोग इस तथ्य के आधार पर करता हूं कि स्ट्रीट और अपार्टमेंट / यूनिट नंबर और साथ ही PoBox, Ph, फ़ैक्स , मोबाइल आदि को अलग करने के बाद केवल पोस्टकोड नंबर ही रहेगा। यह एक regEx के साथ मैच करने के लिए फिर उपनगर (एस) और देश को देखने के लिए आसान है।

आपकी राष्ट्रीय डाकघर सेवा उपनगरों और राज्यों के साथ नि: शुल्क पोस्ट कोड की एक सूची प्रदान करेगी जिसे आप एक्सेल शीट, डीबी टेबल, टेक्स्ट / जोंस / एक्सएमएल फ़ाइल आदि में स्टोर कर सकते हैं।

  1. अंत में, चूंकि कुछ पोस्ट कोड में कई उपनगर होते हैं, जिनकी हम जांच करते हैं कि पता किस उपनगर में दिखाई देता है।

उदाहरण

यहाँ छवि विवरण दर्ज करें

VBA कोड

अस्वीकरण, मुझे पता है कि यह कोड सही नहीं है, या यहां तक ​​कि अच्छी तरह से लिखा गया है, हालांकि किसी भी प्रोग्रामिंग भाषा में परिवर्तित करना और किसी भी प्रकार के एप्लिकेशन में चलाना आसान है। रणनीति आपके देश और नियमों के आधार पर उत्तर है, इस कोड को एक उदाहरण के रूप में लें :

Option Explicit

Private Const TopRow As Integer = 0

Public Sub ParseAddress()
Dim strArr() As String
Dim sigRow() As String
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim Stat As String
Dim SpaceInName As Integer
Dim Temp As String
Dim PhExt As String

On Error Resume Next

Temp = ActiveSheet.Range("Address")

'Split info into array
strArr = Split(Temp, vbLf)

'Trim the array
For i = 0 To UBound(strArr)
strArr(i) = VBA.Trim(strArr(i))
Next i

'Remove empty items/rows    
ReDim sigRow(LBound(strArr) To UBound(strArr))
For i = LBound(strArr) To UBound(strArr)
    If Trim(strArr(i)) <> "" Then
        sigRow(j) = strArr(i)
        j = j + 1
    End If
Next i
ReDim Preserve sigRow(LBound(strArr) To j)

'Find the name (MUST BE ON THE FIRST ROW UNLESS CHECKBOX UNTICKED)
i = TopRow
If ActiveSheet.Shapes("chkFirst").ControlFormat.Value = 1 Then

SpaceInName = InStr(1, sigRow(i), " ", vbTextCompare) - 1

If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
ActiveSheet.Range("FirstName") = VBA.Left(sigRow(i), SpaceInName)
Else
 If MsgBox("First Name: " & VBA.Mid$(sigRow(i), 1, SpaceInName), vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("FirstName") = VBA.Left(sigRow(i), SpaceInName)
End If

If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
ActiveSheet.Range("Surname") = VBA.Mid(sigRow(i), SpaceInName + 2)
Else
  If MsgBox("Surame: " & VBA.Mid(sigRow(i), SpaceInName + 2), vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("Surname") = VBA.Mid(sigRow(i), SpaceInName + 2)
End If
sigRow(i) = ""
End If

'Find the Street by looking for a "St, Pde, Ave, Av, Rd, Cres, loop, etc"
For i = 1 To UBound(sigRow)
If Len(sigRow(i)) > 0 Then
    For j = 0 To 8
    If InStr(1, VBA.UCase(sigRow(i)), Street(j), vbTextCompare) > 0 Then

    'Find the position of the street in order to get the suburb
    SpaceInName = InStr(1, VBA.UCase(sigRow(i)), Street(j), vbTextCompare) + Len(Street(j)) - 1

    'If its a po box then add 5 chars
    If VBA.Right(Street(j), 3) = "BOX" Then SpaceInName = SpaceInName + 5

    If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
    ActiveSheet.Range("Street") = VBA.Mid(sigRow(i), 1, SpaceInName)
    Else
      If MsgBox("Street Address: " & VBA.Mid(sigRow(i), 1, SpaceInName), vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("Street") = VBA.Mid(sigRow(i), 1, SpaceInName)
    End If
    'Trim the Street, Number leaving the Suburb if its exists on the same line
    sigRow(i) = VBA.Mid(sigRow(i), SpaceInName) + 2
    sigRow(i) = Replace(sigRow(i), VBA.Mid(sigRow(i), 1, SpaceInName), "")

    GoTo PastAddress:
    End If
    Next j
End If
Next i
PastAddress:

'Mobile
For i = 1 To UBound(sigRow)
If Len(sigRow(i)) > 0 Then
    For j = 0 To 3
    Temp = Mb(j)
        If VBA.Left(VBA.UCase(sigRow(i)), Len(Temp)) = Temp Then
        If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
        ActiveSheet.Range("Mobile") = VBA.Mid(sigRow(i), Len(Temp) + 2)
        Else
          If MsgBox("Mobile: " & VBA.Mid(sigRow(i), Len(Temp) + 2), vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("Mobile") = VBA.Mid(sigRow(i), Len(Temp) + 2)
        End If
    sigRow(i) = ""
    GoTo PastMobile:
    End If
    Next j
End If
Next i
PastMobile:

'Phone
For i = 1 To UBound(sigRow)
If Len(sigRow(i)) > 0 Then
    For j = 0 To 1
    Temp = Ph(j)
        If VBA.Left(VBA.UCase(sigRow(i)), Len(Temp)) = Temp Then

            'TODO: Detect the intl or national extension here.. or if we can from the postcode.
            If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
            ActiveSheet.Range("Phone") = VBA.Mid(sigRow(i), Len(Temp) + 3)
            Else
              If MsgBox("Phone: " & VBA.Mid(sigRow(i), Len(Temp) + 3), vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("Phone") = VBA.Mid(sigRow(i), Len(Temp) + 3)
            End If

        sigRow(i) = ""
        GoTo PastPhone:
        End If
    Next j
End If
Next i
PastPhone:


'Email
For i = 1 To UBound(sigRow)
    If Len(sigRow(i)) > 0 Then
        'replace with regEx search
        If InStr(1, sigRow(i), "@", vbTextCompare) And InStr(1, VBA.UCase(sigRow(i)), ".CO", vbTextCompare) Then
        Dim email As String
        email = sigRow(i)
        email = Replace(VBA.UCase(email), "EMAIL:", "")
        email = Replace(VBA.UCase(email), "E-MAIL:", "")
        email = Replace(VBA.UCase(email), "E:", "")
        email = Replace(VBA.UCase(Trim(email)), "E ", "")
        email = VBA.LCase(email)

            If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
            ActiveSheet.Range("Email") = email
            Else
              If MsgBox("Email: " & email, vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("Email") = email
            End If
        sigRow(i) = ""
        Exit For
        End If
    End If
Next i

'Now the only remaining items will be the postcode, suburb, country
'there shouldn't be any numbers (eg. from PoBox,Ph,Fax,Mobile) except for the Post Code

'Join the string and filter out the Post Code
Temp = Join(sigRow, vbCrLf)
Temp = Trim(Temp)

For i = 1 To Len(Temp)

Dim postCode As String
postCode = VBA.Mid(Temp, i, 4)

'In Australia PostCodes are 4 digits
If VBA.Mid(Temp, i, 1) <> " " And IsNumeric(postCode) Then

    If ActiveSheet.Shapes("chkConfirm").ControlFormat.Value = 0 Then
    ActiveSheet.Range("PostCode") = postCode
    Else
      If MsgBox("Post Code: " & postCode, vbQuestion + vbYesNo, "Confirm Details") = vbYes Then ActiveSheet.Range("PostCode") = postCode
    End If

    'Lookup the Suburb and State based on the PostCode, the PostCode sheet has the lookup
    Dim mySuburbArray As Range
    Set mySuburbArray = Sheets("PostCodes").Range("A2:B16670")

    Dim suburbs As String
    For j = 1 To mySuburbArray.Columns(1).Cells.Count
    If mySuburbArray.Cells(j, 1) = postCode Then
        'Check if the suburb is listed in the address
        If InStr(1, UCase(Temp), mySuburbArray.Cells(j, 2), vbTextCompare) > 0 Then

        'Set the Suburb and State
        ActiveSheet.Range("Suburb") = mySuburbArray.Cells(j, 2)
        Stat = mySuburbArray.Cells(j, 3)
        ActiveSheet.Range("State") = Stat

        'Knowing the State - for Australia we can get the telephone Ext
        PhExt = PhExtension(VBA.UCase(Stat))
        ActiveSheet.Range("PhExt") = PhExt

        'remove the phone extension from the number
        Dim prePhone As String
        prePhone = ActiveSheet.Range("Phone")
        prePhone = Replace(prePhone, PhExt & " ", "")
        prePhone = Replace(prePhone, "(" & PhExt & ") ", "")
        prePhone = Replace(prePhone, "(" & PhExt & ")", "")
        ActiveSheet.Range("Phone") = prePhone
        Exit For
        End If
    End If
    Next j
Exit For
End If
Next i

End Sub


Private Function PhExtension(ByVal State As String) As String
Select Case State
Case Is = "NSW"
PhExtension = "02"
Case Is = "QLD"
PhExtension = "07"
Case Is = "VIC"
PhExtension = "03"
Case Is = "NT"
PhExtension = "04"
Case Is = "WA"
PhExtension = "05"
Case Is = "SA"
PhExtension = "07"
Case Is = "TAS"
PhExtension = "06"
End Select
End Function

Private Function Ph(ByVal Num As Integer) As String
Select Case Num
Case Is = 0
Ph = "PH"
Case Is = 1
Ph = "PHONE"
'Case Is = 2
'Ph = "P"
End Select
End Function

Private Function Mb(ByVal Num As Integer) As String
Select Case Num
Case Is = 0
Mb = "MB"
Case Is = 1
Mb = "MOB"
Case Is = 2
Mb = "CELL"
Case Is = 3
Mb = "MOBILE"
'Case Is = 4
'Mb = "M"
End Select
End Function

Private Function Fax(ByVal Num As Integer) As String
Select Case Num
Case Is = 0
Fax = "FAX"
Case Is = 1
Fax = "FACSIMILE"
'Case Is = 2
'Fax = "F"
End Select
End Function

Private Function State(ByVal Num As Integer) As String
Select Case Num
Case Is = 0
State = "NSW"
Case Is = 1
State = "QLD"
Case Is = 2
State = "VIC"
Case Is = 3
State = "NT"
Case Is = 4
State = "WA"
Case Is = 5
State = "SA"
Case Is = 6
State = "TAS"
End Select
End Function

Private Function Street(ByVal Num As Integer) As String
Select Case Num
Case Is = 0
Street = " ST"
Case Is = 1
Street = " RD"
Case Is = 2
Street = " AVE"
Case Is = 3
Street = " AV"
Case Is = 4
Street = " CRES"
Case Is = 5
Street = " LOOP"
Case Is = 6
Street = "PO BOX"
Case Is = 7
Street = " STREET"
Case Is = 8
Street = " ROAD"
Case Is = 9
Street = " AVENUE"
Case Is = 10
Street = " CRESENT"
Case Is = 11
Street = " PARADE"
Case Is = 12
Street = " PDE"
Case Is = 13
Street = " LANE"
Case Is = 14
Street = " COURT"
Case Is = 15
Street = " BLVD"
Case Is = 16
Street = "P.O. BOX"
Case Is = 17
Street = "P.O BOX"
Case Is = 18
Street = "PO BOX"
Case Is = 19
Street = "POBOX"
End Select
End Function
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.