কীভাবে ফ্রিফর্ম স্ট্রিট / ডাক ঠিকানা পাঠ্যের বাইরে এবং উপাদানগুলিতে পার্স করা যায়


136

আমরা যুক্তরাষ্ট্রে মূলত ব্যবসা করি এবং সমস্ত ঠিকানা ক্ষেত্রকে একক পাঠ্য ক্ষেত্রে একত্রিত করে ব্যবহারকারীর অভিজ্ঞতা উন্নত করার চেষ্টা করছি। তবে কয়েকটি সমস্যা রয়েছে:

  • ব্যবহারকারীর প্রকারের ঠিকানাটি সঠিক বা মানক ফর্ম্যাটে নাও থাকতে পারে
  • ক্রেডিট কার্ডের অর্থ প্রদানের প্রক্রিয়া করার জন্য ঠিকানাটি অবশ্যই অংশগুলিতে (রাস্তা, শহর, রাজ্য, ইত্যাদি) আলাদা করতে হবে
  • ব্যবহারকারীরা কেবল তাদের ঠিকানার চেয়ে বেশি প্রবেশ করতে পারে (এটির সাথে তাদের নাম বা সংস্থার মতো)
  • গুগল এটি করতে পারে তবে পরিষেবার শর্তাদি এবং ক্যোয়ারী সীমাগুলি বিশেষত শক্ত বাজেটের ক্ষেত্রে নিষিদ্ধ

স্পষ্টতই, এটি একটি সাধারণ প্রশ্ন:

চারপাশের পাঠ্য থেকে কোনও ঠিকানা আলাদা করে টুকরো টুকরো করার কোনও উপায় কি আছে? ঠিকানাগুলি বিশ্লেষণের জন্য নিয়মিত প্রকাশ আছে?


নীচের উত্তরগুলি আরও কার্যকর কারণ তারা বিশ্বব্যাপী সমস্যাটিকে উপেক্ষা করে না - যে ঠিকানাগুলি সাধারণ প্যাটার্নে ফিট করে না।
মার্ক ম্যাক্সমিস্টার

উত্তর:


290

আমি যখন একটি ঠিকানা যাচাইকরণ সংস্থার জন্য কাজ করেছি তখন আমি এই প্রশ্নটি অনেক দেখেছি। একই প্রশ্নটি দিয়ে চারপাশে অনুসন্ধান করা প্রোগ্রামারদের এটি আরও অ্যাক্সেসযোগ্য করার জন্য আমি এখানে উত্তর পোস্ট করছি। আমি যে সংস্থাটিতে কোটি কোটি ঠিকানা প্রক্রিয়াকরণ করেছি এবং আমরা প্রক্রিয়াটিতে অনেক কিছু শিখেছি।

প্রথমত, আমাদের ঠিকানাগুলি সম্পর্কে কয়েকটি বিষয় বুঝতে হবে।

ঠিকানাগুলি নিয়মিত হয় না

এর অর্থ হ'ল নিয়মিত ভাব প্রকাশের বাইরে। আমি এগুলি সব কিছু দেখেছি, সাধারণ নিয়মিত প্রকাশ থেকে যা খুব নির্দিষ্ট বিন্যাসে ঠিকানার সাথে মেলে, এটিতে:

/ \ S + (\ ঘ {2,5} \ S +) ([একটি | পি]?! মি \ b হল) (([ZA-জেড | \ S +] {1,5}) {1,2}) ? ([\ গুলি |, |।]) (([zA-জেড | \ S +] {1,30}) {1,4})? (আদালত | CT | রাস্তায় | St | ড্রাইভ | ড | গলি | Ln | রাস্তা | য় | Blvd) ([\ গুলি |, | |;।]?) (([zA-জেড | \ S +] {1,30}) {1,2}) ([ \ গুলি |, |।]) \ বি (এ কে |? আওয়ামী লীগ | শিরোণামে | জেড | সিএ | সিও | সিটি | ডিসি | ডেন | এফএল | জি | জি ইউ | হাই | আইএ | আইডি | আইএল | ইন | কে এস | বিভাগ | এলএ | এমএ | এমডি | আমাকে | এমআই | ​​এম এন | এমও | মাইক্রোসফট | এমটি | এনসি | এনডি | এনই | NH, | এনজে | এনএম | এনভি | এনওয়াই | বাড়ি | ঠিক আছে | অথবা | পিএ | সশ্রম | এসসি | এসডি | টি এন | টেক্সাস | কেন্দ্রশাসিত অঞ্চল | ভিএ | ষষ্ঠ |, VT | বিভাগ | ওয়েস্ট ইন্ডিজ | আরো | দেশ অনুযায়ী) ([\ গুলি |, |।] + +) (\ S + \ ঘ {5}) ([\ গুলি |, |।]? + +); / i

... এটি যেখানে 900+ লাইন-শ্রেণীর ফাইলটি আরও বেশি ম্যাচের জন্য ফ্লাইতে একটি সুপারম্যাসিভ নিয়মিত প্রকাশ তৈরি করে। আমি এগুলিকে সুপারিশ করি না (উদাহরণস্বরূপ, এখানে উপরের রেইগেক্সের একটি ঝাঁকুনি, এটি প্রচুর ভুল করে )। এটি কাজ করার সহজ কোনও যাদু সূত্র নেই isn't তত্ত্ব এবং দ্বারা তত্ত্ব, এটি একটি রেগুলার এক্সপ্রেশনের সাথে ঠিকানাগুলির সাথে মেলানোর জন্য সম্ভব নয়।

ইউএসপিএস পাবলিকেশন ২৮ তাদের সমস্ত কীওয়ার্ড এবং ভেরিয়েটনের সাহায্যে ঠিকানার অনেকগুলি ফর্ম্যাট ডকুমেন্ট করে। সবচেয়ে খারাপ, ঠিকানাগুলি প্রায়শই অস্পষ্ট থাকে। শব্দের অর্থ একাধিক জিনিসের অর্থ হতে পারে ("সেন্ট" "সেন্ট" বা "রাস্তার" হতে পারে) এবং এমন শব্দ রয়েছে যা আমি নিশ্চিত যে তারা আবিষ্কার করেছিলেন। (কে জানত যে "স্ট্রেন্যু" একটি রাস্তার প্রত্যয়?)

আপনার এমন কিছু কোডের দরকার যা সত্যিকার অর্থে ঠিকানাগুলি বোঝে এবং যদি সেই কোডটি উপস্থিত থাকে তবে এটি একটি ব্যবসায়ের গোপনীয়তা। আপনি সম্ভবত এটির মধ্যে থাকলে আপনি সম্ভবত নিজের রোল করতে পারেন।

ঠিকানাগুলি অপ্রত্যাশিত আকার এবং আকারে আসে

এখানে কয়েকটি অনুমোদিত (তবে সম্পূর্ণ) ঠিকানা রয়েছে:

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. নম্বরটিও সম্পূর্ণ, কারণ জিপ কোডটি অনন্য , যার অর্থ একটি ব্যক্তিগত সত্তা বা কর্পোরেশন সেই ঠিকানার জায়গাটি কিনেছে। একটি অনন্য জিপ কোড উচ্চ-ভলিউম বা কেন্দ্রীভূত বিতরণ স্থানগুলির জন্য। জিপ কোড 12345 তে সম্বোধিত যেকোন কিছুই এনওয়াইয়ের স্কেনেকটাডি জেনারেল ইলেকট্রিকের কাছে যায়। এই উদাহরণটি বিশেষত কারও কাছে পৌঁছবে না, তবে ইউএসপিএস এখনও এটি সরবরাহ করতে সক্ষম হবে।

  5. 5 নম্বরটিও সম্পূর্ণ, বিশ্বাস করুন বা না করুন। কেবলমাত্র এই সংখ্যাগুলির সাথে, সমস্ত সম্ভাব্য ঠিকানাগুলির একটি ডাটাবেসের বিরুদ্ধে পার্স করার সময় পুরো ঠিকানাটি সন্ধান করা যেতে পারে। অনুপস্থিত দিকনির্দেশক, গৌণ ডিজাইনার এবং জিপ + 4 কোড পূরণ করা তুচ্ছ হয় যখন আপনি প্রতিটি সংখ্যাকে উপাদান হিসাবে দেখেন। এটি দেখতে দেখতে সম্পূর্ণরূপে প্রসারিত এবং মানকৃত হয়েছে:

205 এন 1105 ডাব্লু এপ্ট 14

বেভারলি হিলস সিএ 90210-5221

ঠিকানা ডেটা আপনার নিজস্ব নয়

বেশিরভাগ দেশে যারা লাইসেন্সপ্রাপ্ত বিক্রেতাদের অফিসিয়াল ঠিকানার ডেটা সরবরাহ করে, ঠিকানা ডেটা নিজেই পরিচালনা সংস্থাটির অন্তর্ভুক্ত। মার্কিন যুক্তরাষ্ট্রে ইউএসপিএসের ঠিকানাগুলির মালিকানা রয়েছে। কানাডা পোস্ট, রয়েল মেল এবং অন্যদের ক্ষেত্রেও এটি একই সত্য, যদিও প্রতিটি দেশই মালিকানাটিকে কিছুটা ভিন্নভাবে প্রয়োগ করে বা সংজ্ঞায়িত করে। এটি জানা গুরুত্বপূর্ণ, কারণ এটি সাধারণত ঠিকানা ডাটাবেসটিকে রিভার্স-ইঞ্জিনিয়ারিং করতে নিষেধ করে। কীভাবে ডেটা অর্জন, সঞ্চয় এবং ব্যবহার করতে হয় সে সম্পর্কে আপনাকে সতর্কতা অবলম্বন করতে হবে।

গুগল ম্যাপস দ্রুত ঠিকানা ঠিক করার জন্য সাধারণ পদে পদে পদে পদে পদক্ষেপ গ্রহণ করা যায়, তবে টিওএস বরং প্রতিরোধমূলক; উদাহরণস্বরূপ, আপনি কোনও গুগল ম্যাপ না দেখিয়ে তাদের ডেটা বা এপিআইগুলি ব্যবহার করতে পারবেন না, এবং অ-কমিক্রেটিভ উদ্দেশ্যে কেবল (আপনি অর্থ প্রদান না করে), এবং আপনি ডেটা সংরক্ষণ করতে পারবেন না (অস্থায়ী ক্যাচিং বাদে)। বোধ হয়। গুগলের ডেটা বিশ্বের সেরা কিছু। তবে গুগল ম্যাপস ঠিকানাটি যাচাই করে না । একটি ঠিকানা অস্তিত্ব নেই, এটা এখনও তোমাকে দেখাব যেখানে ঠিকানা হবে যদি এটা হতে করেনি থাকবেই (আপনার নিজের রাস্তায় এটা চেষ্টা; একটি বাড়ি সংখ্যা আপনাকে জানাতে চাই যে অস্তিত্ব নেই ব্যবহার করুন)। এটি কখনও কখনও দরকারী, তবে সে সম্পর্কে সচেতন থাকুন।

নমিনিটিমের ব্যবহার নীতিটি একইভাবে সীমাবদ্ধ, বিশেষত উচ্চ পরিমাণ এবং বাণিজ্যিক ব্যবহারের জন্য, এবং ডেটা বেশিরভাগ বিনামূল্যে উত্স থেকে আঁকা হয়, তাই এটি যথাযথভাবে রক্ষণাবেক্ষণ করা হয় না (যেমন উন্মুক্ত প্রকল্পগুলির প্রকৃতি) - তবে এটি এখনও উপযুক্ত হতে পারে আপনার চাহিদা. এটি একটি দুর্দান্ত সম্প্রদায় দ্বারা সমর্থিত।

ইউএসপিএসের নিজেই একটি এপিআই রয়েছে তবে এটি অনেকটাই নিচে নেমে আসে এবং কোনও গ্যারান্টি বা সমর্থন ছাড়াই আসে। এটি ব্যবহার করাও কঠিন হতে পারে। কিছু লোক কোনও সমস্যা ছাড়াই অল্প পরিমাণে এটি ব্যবহার করে। তবে এটি সহজেই মিস করা যায় যে ইউএসপিএসের প্রয়োজন হয় যে আপনি তাদের এপিআই কেবল তাদের মাধ্যমে শিপিংয়ের জন্য ঠিকানাগুলি নিশ্চিত করার জন্য ব্যবহার করুন।

লোকেরা আশা করে ঠিকানাগুলি শক্ত হবে

দুর্ভাগ্যক্রমে, আমরা আমাদের সমাজকে ঠিকানাগুলি জটিল হওয়ার আশা করার শর্ত দিয়েছি। এটি সম্পর্কে পুরো ইন্টারনেটে কয়েক ডজন ভাল ইউএক্স নিবন্ধ রয়েছে, তবে আসল বিষয়টি হ'ল আপনার যদি পৃথক ক্ষেত্রগুলির সাথে ঠিকানা ফর্ম থাকে তবে এটি ব্যবহারকারীরা প্রত্যাশা করেন, যদিও এটি প্রান্ত-কেস অ্যাড্রেসগুলির পক্ষে শক্ত করে না যা এটি ফিট করে না that ফর্ম্যাটটি ফর্মটি প্রত্যাশা করছে, বা ফর্মটির এমন ক্ষেত্র প্রয়োজন যা এটি করা উচিত নয়। অথবা ব্যবহারকারীরা তাদের ঠিকানার নির্দিষ্ট অংশটি কোথায় রাখবেন তা জানেন না।

আমি এই দিনগুলিতে চেকআউট ফর্মগুলির খারাপ ইউএক্স সম্পর্কে অব্যাহত রাখতে পারলাম, তবে পরিবর্তে আমি কেবল এটিই বলব যে ঠিকানাগুলিকে একটি একক ক্ষেত্রে একত্রিত করা একটি স্বাগত পরিবর্তন হবে - লোকেরা তাদের ঠিকানাকে কীভাবে ফিট করে তা টাইপ করতে সক্ষম হবে বরং আপনার দীর্ঘ ফর্মটি বের করার চেষ্টা করার চেয়ে। যাইহোক, এই পরিবর্তনটি অপ্রত্যাশিত হবে এবং ব্যবহারকারীরা প্রথমে এটি কিছুটা ঝাঁকুনির মতো দেখতে পাবেন। শুধু সচেতন হতে হবে।

দেশের মাঠকে সামনে রেখে, ঠিকানার আগে, এই ব্যথার কিছুটা অংশ হ্রাস করা যায়। যখন তারা প্রথমে দেশের ক্ষেত্রটি পূরণ করে, আপনি কীভাবে আপনার ফর্মটি উপস্থিত করবেন তা জানেন। সম্ভবত আপনার এককক্ষেত্রের মার্কিন ঠিকানাগুলির সাথে ডিল করার ভাল উপায় রয়েছে, সুতরাং যদি তারা মার্কিন যুক্তরাষ্ট্র নির্বাচন করে তবে আপনি আপনার ফর্মটি একটি একক ক্ষেত্রে হ্রাস করতে পারবেন, অন্যথায় উপাদান ক্ষেত্রগুলি দেখান। চিন্তা করার মতো বিষয়গুলি!

এখন আমরা জানি কেন এটি শক্ত; এ ব্যাপারে আপনি কি করতে পারেন?

ইউএসপিএস গ্রাহকদের যাচাই করা ঠিকানা সরবরাহের জন্য CASS ™ শংসাপত্র নামক একটি প্রক্রিয়ার মাধ্যমে বিক্রেতাদের লাইসেন্স দেয়। এই বিক্রেতাদের মাসিক আপডেট হওয়া ইউএসপিএস ডাটাবেসে অ্যাক্সেস রয়েছে। তাদের সফ্টওয়্যারটি অবশ্যই শংসাপত্রের জন্য কঠোর মান মেনে চলতে হবে এবং তাদের প্রায়শই উপরে বর্ণিত সীমাবদ্ধ পদগুলির সাথে চুক্তির প্রয়োজন হয় না।

অনেকগুলি সিএসএস-প্রত্যয়িত সংস্থাগুলি রয়েছে যা তালিকাগুলি প্রক্রিয়াকরণ করতে পারে বা এপিআইগুলি রাখতে পারে: মেলিসা ডেটা, এক্সপেরিয়ান কিউএএস, এবং স্মার্টস্ট্রিস্টের কয়েকটি নাম লেখানোর জন্য।

("বিজ্ঞাপন" এর ঝাঁকুনির কারণে আমি এই মুহুর্তে আমার উত্তরটি কেটে ফেলেছি you আপনার পক্ষে কার্যকর সমাধান খুঁজে পাওয়া আপনার পক্ষে))

সত্য: সত্যই, ভাবেন, আমি এই সংস্থাগুলির কোনওটিতেই কাজ করি না। এটি কোনও বিজ্ঞাপন নয়।


1
দক্ষিণ আমেরিকান (উরুগুয়ে) ঠিকানা সম্পর্কে কী? : ডি
বার্ট ক্যালিক্স্টো

11
@ ব্রায়ান - সম্ভবত তারা প্রশ্ন ও উত্তর পড়ার জন্য তাদের প্রচুর দরকারী তথ্য সরবরাহ করেছে কারণ তারা তার কোম্পানির পণ্য ব্যবহার করা বেছে নিবে না তা বিবেচনা না করেই।
জেরেফেথ

7
@ ব্রায়ান এই সাইটগুলি বিষয়বস্তু স্ক্র্যাপার। তারা এসইআরপি র‌্যাঙ্কিং পেতে সামগ্রীতে বিদ্রূপ করছে। আমি তাদের আগে কখনও দেখিনি। আমি এই সামগ্রীটি আগে বা অন্য কোথাও পোস্ট করি নি have
ম্যাট

2
@ খুদার্ম আমি যখন আপনার মন্তব্যটি পড়লাম তখনই আমি লক্ষ্য করেছি যে সমস্ত মতবিরোধমূলক মন্তব্যগুলি অদৃশ্য হয়ে গেছে; কীভাবে / কখন ঘটেছিল তা নিশ্চিত নয়। তবে যাইহোক, আমার উত্তরটির সম্পাদনার ইতিহাস দেখুন এবং আপনি কোনও মার্কিন ঠিকানা এক্সট্রাক্টরের সরাসরি ডিরেক্টরি দেখতে পাবেন যা আপনাকে সাহায্য করতে পারে। আমি আমার শেষ কাজটিতে কাজ করার সময় এটি তৈরি করেছি, তবে এটি মালিকানাধীন কোড যাতে আমি এটি ভাগ করতে পারি না ... তবে তাদের উপস্থিতি রয়েছে। আশা করি সহায়ক।
ম্যাট 5

2
উফ। দুঃখিত @ ম্যাট ঠিক আছে আমি আপনাকে আপনার প্রশ্ন এবং গিথুবের মাধ্যমে অনুসরণ করতে শুরু করেছি। বেশ আপনি চিত্তাকর্ষক।
সায়কা

28

লিবিপোস্টাল: ঠিকানাগুলি পার্স করার জন্য একটি ওপেন-সোর্স লাইব্রেরি, ওপেনস্ট্রিটম্যাপ, ওপেনএড্রেসস এবং ওপেনকেজ থেকে ডেটা সহ প্রশিক্ষণ।

https://github.com/openvenues/libpostal ( এটি সম্পর্কে আরও তথ্য )

অন্যান্য সরঞ্জাম / পরিষেবা:


13

অনেক রাস্তার ঠিকানা পার্সার রয়েছে। এগুলি দুটি মৌলিক স্বাদে আসে - যেগুলির স্থানের নাম এবং রাস্তার নামের ডেটাবেস থাকে এবং যেগুলি না।

একটি নিয়মিত প্রকাশ রাস্তার ঠিকানা পার্সার অনেক ঝামেলা ছাড়াই প্রায় 95% সাফল্যের হার পেতে পারে। তারপরে আপনি অস্বাভাবিক ক্ষেত্রে আঘাত করা শুরু করেন। সিপিএএন-এর পার্ল ওয়ান, "জিও :: স্ট্রিট অ্যাড্রেস :: ইউএস", এটি প্রায় ভাল। পাইথন এবং জাভাস্ক্রিপ্ট বন্দরগুলি রয়েছে, সমস্ত ওপেন সোর্স। পাইথনে আমার একটি উন্নত সংস্করণ রয়েছে যা আরও বেশি কেস পরিচালনা করে সাফল্যের হারকে কিছুটা উপরে নিয়ে যায়। যদিও সর্বশেষ 3% ডান পেতে, আপনার দ্ব্যর্থহীনতায় সহায়তা করার জন্য ডাটাবেসগুলির প্রয়োজন।

3-অঙ্কের জিপ কোড এবং মার্কিন রাষ্ট্রের নাম এবং সংক্ষেপগুলি সহ একটি ডাটাবেস একটি বড় সহায়তা। কোনও পার্সার যখন একটি সামঞ্জস্যপূর্ণ পোস্টাল কোড এবং রাষ্ট্রের নাম দেখেন, তখন এটি ফর্ম্যাটে লক করা শুরু করতে পারে। এটি মার্কিন যুক্তরাষ্ট্র এবং যুক্তরাজ্যের পক্ষে খুব ভাল কাজ করে।

সঠিক রাস্তার ঠিকানা পার্সিং শেষ থেকে শুরু হয় এবং পিছনের দিকে কাজ করে। ইউএসপিএস সিস্টেমগুলি এটি করে। ঠিকানাগুলি অন্তত অস্পষ্ট, যেখানে দেশের নাম, শহরের নাম এবং ডাক কোডগুলি সনাক্ত করা তুলনামূলকভাবে সহজ। রাস্তার নামগুলি সাধারণত বিচ্ছিন্ন করা যায়। রাস্তায় অবস্থানগুলি পার্স করার পক্ষে সবচেয়ে জটিল; সেখানে আপনি "পঞ্চম তল" এবং "স্ট্যাপলস পাভিলিয়ন" এর মতো জিনিসগুলির মুখোমুখি হন। এটি তখনই যখন একটি ডাটাবেস একটি বড় সহায়তা।


এছাড়াও সিপিএএন মডিউলটি রয়েছে লিঙ্গুয়া: এন :: ঠিকানা পার্স। । "জিও :: StreetAddress :: মার্কিন তুলনায় ধীর, এটি একটি উচ্চ সাফল্যের হার দেয় যদিও
কিম রায়ান

8

আপডেট: জিওকোড.অক্সিজ এখন বিশ্বব্যাপী কাজ করে। উদাহরণস্বরূপ https://geocode.xyz দেখুন

মার্কিন যুক্তরাষ্ট্র, মেক্সিকো এবং কানাডার জন্য জিওকোডার . ca দেখুন

উদাহরণ স্বরূপ:

ইনপুট: মূল এবং আর্থার কেটে আরডি নিউ ইয়র্ককে ছেদ করার কাছাকাছি যা কিছু চলছে

আউটপুট:

<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>

আপনি ওয়েব ইন্টারফেসে ফলাফলগুলি পরীক্ষা করতে পারেন বা জসন বা জসনপ হিসাবে আউটপুট পেতে পারেন। যেমন। আমি 123 মেইন স্ট্রিট, নিউ ইয়র্ক এর আশেপাশে রেস্তোঁরা খুঁজছি


কীভাবে আপনি ওপেনড্রেস ব্যবহার করে ঠিকানা পার্সিং সিস্টেমটি প্রয়োগ করেছেন? আপনি কি নিষ্ঠুর শক্তি কৌশল ব্যবহার করছেন?
নিতিন কে অনিল

1
'ব্রুট ফোর্স' বলতে কী বোঝ? সম্ভাব্য ঠিকানার স্ট্রিংয়ের সমস্ত সম্ভাব্য সংমিশ্রণে পাঠ্য ভাঙা এবং প্রত্যেকের সাথে ঠিকানাগুলির একটি ডাটাবেসের তুলনা করা ব্যবহারিক নয় এবং এই সিস্টেমটির চেয়ে উত্তর দেওয়ার ক্ষেত্রে আরও বেশি সময় লাগবে। অ্যালগরিদমের জন্য ঠিকানা ফরম্যাটের একটি 'প্রশিক্ষণ সেট' তৈরির জন্য ডেটা উত্সগুলির মধ্যে ওপেনএড্রেসগুলি অন্যতম। এটি এই তথ্যটি অস্ট্রাস্ট্রাক্টড পাঠ্যের বাইরে ঠিকানা পার্স করতে ব্যবহার করে।
এরভিন রুসি

2
আর একটি অনুরূপ সিস্টেম হ'ল জিও :: লাইবপোস্টাল ( পার্লট্রিক্স / পার্টিকেল / ন্যানসোসিং- জিও-- লিবিপোস্টাল ) তারা ওপেন স্ট্রিটম্যাপ এবং ওপেনড্রেস ব্যবহার করে যা বলে মনে হয়, উড়তে ঠিকানার টেমপ্লেট তৈরি করতে
এরভিন রুসি

আমি মাত্র কয়েকশো প্রকৃত ঠিকানার উপরে জিওকোড.অক্সিজের জিওপার্সার (পাঠ্যে প্রেরণ, অবস্থান ফিরে পেতে) পরীক্ষা করেছি। গুগল ম্যাপের এপিআই, এবং ঠিকানাগুলির একটি বিশ্বব্যাপী সেট সহ পাশাপাশি দেওয়া হয়েছে , geocode.xyzএর scantextপদ্ধতি বেশিরভাগ সময় ব্যর্থ হয়েছিল। এটি সর্বদা "জেনেভা, মার্কিন" "জেনেভা, সুইজারল্যান্ড" এর চেয়ে বেশি পছন্দ করে এবং সাধারণত মার্কিন পক্ষপাতদুষ্ট ছিল।
মার্ক ম্যাক্সমিস্টার 16

ইহা পারিপার্শ্বিক অবস্থা উপর নির্ভর করে। geocode.xyz/?scantext=Geneva,%20 সুইজারল্যান্ড উত্পাদন করবে: ম্যাচের অবস্থান জেনেভা, সুইজারল্যান্ড, সিএইচ কনফিডেন্স স্কোর: 0.8 এবং জিওকোড.অ্যাকিজ /?scantext= জেনেভা, ১০০ ইউএসএ ম্যাচের অবস্থান জেনেভা তৈরি করবে, মার্কিন আত্মবিশ্বাস স্কোর: 1.0 এছাড়াও, আপনি নিম্নরূপ পক্ষপাতিত্ব করতে পারেন: geocode.xyz/?scantext=Geneva,%20USA®ion=CH
এরভিন

4

কোনো সংকেত নেই? লজ্জা হয় না তোমার!

এখানে একটি সাধারণ জাভাস্ক্রিপ্ট ঠিকানা পার্সার দেওয়া আছে। এটি উপরের গবেষণাপত্রে ম্যাট যে প্রতিটি কারণেই দেয় তার জন্য এটি অত্যন্ত ভয়াবহ (যা আমি প্রায় 100% এর সাথে একমত): ঠিকানাগুলি জটিল ধরণের, এবং মানুষ ভুল করে; এটি আউটসোর্স করা এবং স্বয়ংক্রিয়ভাবে করা - যখন আপনি সামর্থ্য রাখতে পারেন)।

তবে কান্নাকাটি না করে চেষ্টা করার সিদ্ধান্ত নিয়েছি:

এই কোডটির জন্য বেশিরভাগ এসরি ফলাফল পার্স করার জন্য ঠিক আছেfindAddressCandidateএবং এমন কিছু অন্যান্য (বিপরীত) জিওকোডারদের সাথেও যেখানে একক-লাইনের ঠিকানা ফিরে আসে যেখানে রাস্তায় / শহর / রাজ্য কমা দ্বারা সীমানা করা হয়। আপনি বা দেশ-নির্দিষ্ট পার্সারগুলি লিখতে চাইলে প্রসারিত করতে পারেন। অথবা এই অনুশীলনটি কতটা চ্যালেঞ্জপূর্ণ হতে পারে বা জাভাস্ক্রিপ্টে আমি কতটা লম্পট সে বিষয়ে কেস স্টাডি হিসাবে এটি ব্যবহার করুন। আমি স্বীকার করি যে আমি এটিতে প্রায় ত্রিশ মিনিট ব্যয় করেছি (ভবিষ্যতের পুনরাবৃত্তিগুলি ক্যাশে, জিপ যাচাইকরণ এবং রাষ্ট্রের অবস্থানগুলি পাশাপাশি ব্যবহারকারীর অবস্থানের প্রেক্ষাপট যুক্ত করতে পারে) তবে এটি আমার ব্যবহারের ক্ষেত্রে কাজ করেছিল: শেষ ব্যবহারকারীর এমন ফর্মটি দেখা যায় যা জিওকোড অনুসন্ধান প্রতিক্রিয়াটিকে 4 এ পার্স করে textboxes। যদি ঠিকানা পার্সিং ভুল হয়ে আসে (উত্স ডেটা দুর্বল না হলে যা বিরল) এটি কোনও বড় কথা নয় - ব্যবহারকারী এটি যাচাই করে ঠিক করতে পারে! (তবে স্বয়ংক্রিয় সমাধানগুলির জন্য ত্রুটি হিসাবে বাতিল বা অগ্রাহ্য বা পতাকাঙ্কিত করতে পারে যাতে দেব হয় নতুন ফর্ম্যাটটিকে সমর্থন করতে পারে বা উত্স ডেটা ঠিক করতে পারে))

/* 
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>


দাবি অস্বীকার: আমার ক্লায়েন্টরা তাদের ঠিকানা ডেটার মালিক এবং তাদের নিজস্ব এসরি সার্ভার চালায়। আপনি যদি গুগল, ওএসএম, আর্কজিসঅনলাইন, বা যে কোনও জায়গা থেকে ডেটা ধরে থাকেন তবে এটি সংরক্ষণ এবং ব্যবহার করা ঠিক আছে কিনা তা নিশ্চিত করুন (অনেক পরিষেবাগুলিতে আপনি কীভাবে সংরক্ষণ করতে পারেন এবং
কতক্ষণের

উপরের প্রথম উত্তরটি একটি বাধ্যকারী কেস করে তোলে যে আপনি যদি কোনও বিশ্বব্যাপী ঠিকানা তালিকার সাথে কাজ করে থাকেন তবে এই সমস্যাটি রেজিজেসগুলির সাথে অলসযোগ্য। ২০০ টি দেশে অনেক ব্যতিক্রম রয়েছে। আমার পরীক্ষায়, আপনি নির্ভরযোগ্যভাবে একটি স্ট্রিং থেকে দেশটি নির্ধারণ করতে পারেন, তারপরে প্রতিটি দেশের জন্য একটি স্পেসিফিক রেজেক্স সন্ধান করুন - এটি সম্ভবত আরও ভাল API গুলি কীভাবে কাজ করে।
মার্ক ম্যাক্সমিস্টার 16

2

আপনি যদি ওএসএম ডেটার উপর নির্ভর করতে চান তবে লাইবপোস্টাল খুব শক্তিশালী এবং অ্যাড্রেস ইনপুট সহ প্রচলিত সাধারণ ক্যাভ্যাটগুলি পরিচালনা করে।


আমি মনে করি আপনার উত্তরটি এই পোস্টটির একটি সদৃশ যদিও ভাল পরামর্শ।
মাইকেল - ক্লে শির্কি কোথায়

2

মার্কিন ভিত্তিক ঠিকানাগুলির জন্য অন্য বিকল্পটি হ'ল ওয়াই অ্যাড্রেস (আমি যে কোম্পানির জন্য কাজ করি তার দ্বারা তৈরি)।

এই প্রশ্নের অনেক উত্তর সমাধান হিসাবে জিওকোডিং সরঞ্জামগুলির পরামর্শ দেয়। ঠিকানার পার্সিং এবং জিওকোডিংকে বিভ্রান্ত না করা গুরুত্বপূর্ণ; তারা একই নয়. জিওকোডাররা কোনও ঠিকানা পার্শ্ব সুবিধা হিসাবে উপাদানগুলিতে বিভক্ত করতে পারে তবে তারা সাধারণত অ-মানক ঠিকানা সেটগুলিতে নির্ভর করে। এর অর্থ হ'ল জিওকোডার-পার্সড ঠিকানাটি অফিসিয়াল ঠিকানার মতো নয়। উদাহরণস্বরূপ, গুগল জিওকোডিং এপিআই ম্যানহাটনে "6th ষ্ঠ অ্যাভ" বলছে, ইউএসপিএস "আমেরিকান এর অ্যাভিনিউ" বলে।


2

মার্কিন ঠিকানা পার্সিংয়ের জন্য,

আমি ইউএসএড্রেস প্যাকেজটি ব্যবহার করতে পছন্দ করি যা কেবল ইউএসএড্রেসের জন্য পাইপে উপলব্ধ

python3 -m pip install usaddress

ডকুমেন্টেশন
পিপিআই

এটি মার্কিন ঠিকানার জন্য আমার পক্ষে ভাল কাজ করেছে।

#!/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)))

ঠিকানা_পার্সার.পি চালানো

 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

আমি পার্টিতে দেরি করেছি, এখানে অস্ট্রেলিয়ার হয়ে কয়েক বছর আগে আমি লিখেছিলাম একটি এক্সেল ভিবিএ স্ক্রিপ্ট। অন্যান্য দেশগুলিকে সমর্থন করার জন্য এটি সহজেই সংশোধন করা যেতে পারে। আমি এখানে সি # কোডের একটি গিটহাবের সংগ্রহশালা তৈরি করেছি। আমি এটি আমার সাইটে হোস্ট করেছি এবং আপনি এটি এখানে ডাউনলোড করতে পারেন: http://jeremythompson.net/rocks/ParseAddress.xlsm

কৌশল

এমন কোনও পোস্টকোড সহ যে কোনও দেশের জন্য এটি সংখ্যা বা খুব রেজিএক্সের সাথে মিলে যেতে পারে আমার কৌশলটি খুব ভালভাবে কাজ করে:

  1. প্রথমে আমরা প্রথম এবং উপাধি সনাক্ত করি যা শীর্ষ রেখা হিসাবে ধরে নেওয়া হয়। নামটি এড়ানো সহজ এবং চেকবক্সটি অনির্দিষ্ট করে ঠিকানা দিয়ে শুরু করা (নীচে দেখানো হিসাবে 'নাম শীর্ষ সারিতে' বলা হয়)।

  2. এরপরে স্ট্রিট এবং নম্বর সমন্বিত ঠিকানাটি আশা করা নিরাপদ, শহরতলির আগে এবং সেন্ট, পিডি, আভে, অ্যাভি, আরডি, ক্রেস, লুপ ইত্যাদির বিভাজক হওয়ার আগে আসবে।

  3. শহরতলির তুলনায় রাজ্য এবং এমনকি দেশটি সনাক্ত করা সর্বাধিক পরিশীলিত পার্সারকে বিভ্রান্ত করতে পারে কারণ সেখানে বিবাদ হতে পারে। এ থেকে উত্তরণের জন্য আমি স্ট্রিট এবং অ্যাপার্টমেন্ট / ইউনিট নম্বর এবং পোওবক্স, পিএইচ, ফ্যাক্স , মোবাইল ইত্যাদি সরিয়ে দেওয়ার পরেও একটি পোস্টকোড লুক আপ ব্যবহার করি । এরপরে শহরতলির এবং দেশের সন্ধানের জন্য একটি রেজিএক্সের সাথে মিলিয়ে নেওয়া সহজ।

আপনার জাতীয় পোস্ট অফিস পরিষেবা শহরতলির এবং রাজ্যের সাথে নিখরচায় পোস্ট কোডগুলির একটি তালিকা সরবরাহ করবে যা আপনি একটি এক্সেল শীট, ডিবি টেবিল, পাঠ্য / জেসন / এক্সএমএল ফাইল ইত্যাদিতে সঞ্চয় করতে পারেন store

  1. অবশেষে, কিছু পোস্ট কোডের একাধিক শহরতলির উপস্থিতি রয়েছে যা আমরা ঠিক করি যে কোন শহরতলিতে ঠিকানায় উপস্থিত হয়।

উদাহরণ

এখানে চিত্র বর্ণনা লিখুন

ভিবিএ কোড

অস্বীকৃতি, আমি জানি যে এই কোডটি নিখুঁত নয়, এমনকি ভালভাবে লেখাও হয়েছে তবে কোনও প্রোগ্রামিং ভাষায় রূপান্তর করা এবং যে কোনও প্রকারের অ্যাপ্লিকেশন চালানো খুব সহজ strategy কৌশলটি আপনার দেশ এবং নিয়মের উপর নির্ভর করে উত্তর, এই কোডটিকে উদাহরণ হিসাবে গ্রহণ করুন :

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.