سؤال

ونحن نعمل على تطوير c# التطبيق الذي الواردات معالجة البيانات إلى نظام إدارة علاقات العملاء.CSV ملف يحتوي على عنوان العمود مثل 'Somethingstreet 34'.إدارة علاقات العملاء لدينا ومع ذلك يستخدم اثنين مختلف المجالات من أجل streetname و housenumber.بالطبع, وعلى هذا لا يشكل أي مشكلة.ولكن لدينا الهولندية معالجة النظام يمكن أن يكون قليلا من الألم.

العالم الحقيقي أمثلة:

  • Somestreet 88 أ (حيث 'Somestreet' هو streetname و 88 أ على housenumber)
  • 2e فان Blankenburgstraat 123أ (حيث '2e فان Blankenburgstraat' هو streetname ، '123أ' هو housenumber)
  • 2e فان Blankenburgstraat 123-a (حيث '2e فان Blankenburgstraat' هو streetname ، '123-a' هو housenumber)
  • 2e فان Blankenburgstraat 123 a (حيث '2e فان Blankenburgstraat' هو streetname ، '123 أ' هو housenumber)

الآن أنا أبحث عن وظيفة طيبة (باستخدام التعابير المنطقية أو ما شابه) أن يقسم هذه addresslines بشكل صحيح في حقلين.هناك لطيفة نظيفة طريقة للقيام بذلك ؟


تحرير:

فعلت بعض مزيد من التحقيق على معالجة النظام يبدو (شكرا لك الحكومة) أن الأمثلة المذكورة أعلاه ليست حتى 'أسوأ' منها.

بعض أكثر (هذه هي شوارع حقيقية وأرقام):

  • Rivium 1e Straat 53/ET6 (حيث 'Rivium 1e Straat' هو الشارع و '53/ET6' هو housenumber)
  • بلين 1940-1945 34 (حيث 'بلين 1940-1945' هو الشارع و '34' هو housenumber)
  • أبولو 11-Laan 11 (حيث 'أبولو 11-Laan' هو الشارع و '11' (والثاني) هو housenumber)
  • تشارتا 77 فارت 159 ح 3 (حيث 'تشارتا 77 فارت' هو streetname و '159 ح 3' هو housenumber)
  • تشارتا 77 فارت 44/2 (حيث 'تشارتا 77 فارت' هو streetname و '44/2' هو housenumber)
هل كانت مفيدة؟

المحلول

أفضل حل صحة البيانات مقارنة قاعدة البيانات الموجودة ضد عنوان معروف api التي لديه وظيفة للقيام بذلك بالنسبة لك.وإلا كنت مجرد إعطاء الخاص بك أفضل تخمين بعض إن لم يكن كل البيانات ينبغي أن تستعرض يدويا.

نصائح أخرى

ما فعلته, ولكن أشك في أنه هو الأكثر performant الحل هو عكس العنوان ومن ثم الحصول على الجزء الأول حتى تجد أرقام و أخذ كل منهم.أيعلى regex .*\d+ على عكس العنوان.هذا يحل مشكلتك عند الشارع يحتوي على أرقام.

يمكنك أن تفعل شيئا حيث يمكنك تقسيم على مسافات ثم تحقق لمعرفة ما إذا كان الحرف الأول من بعض الداخل السلسلة صحيحا ؟

مثل

 char[] splits = new char[1];
 splits[0] = ' ';
 string[] split = addressLine.split(splits);
 int splitLoc = -1, i;
 for (i =1; i < split.Length; i++){//start at 1 to avoid the first '2e' streets
     int theFirstDigit = -1;
     try{
        theFirstDigit = int.Parse(split[i].Substring(0,1));
     }catch {
        //ignore; parse fails with an exception
     }
     if (theFirstDigit != -1){
         splitLoc = i;
         break;
     }
 }
 if (splitLoc < 0) return; //busted
 string field1, field2;
 for (i = 0; i < splitLoc; i++){
     field1+= split[i] + " ";
 }

 for (i = splitLoc; i < split.Length; i++){
     field2+= split[i] + " ";
 }

يعتمد على ما تعنيه 'نظيفة', ولكن على ما يبدو أن العمل إذا كان كل عناوين يمكن تشكيل الطريقة التي قمت بتحديدها.

هناك الكثير من الطرق المختلفة شخص ما يمكن أن إدخال هذه البيانات.أنا في كثير من الأحيان كتابة العنوان:

123 فو شارع Apt#3

أي مع المنزل و الشقة الأرقام على حد سواء من اسم الشارع

إذا كانت هذه مشكلتي أنني سوف أكتب regex الذي يعالج "سهلة" منها أعلام المعقدة الإنسان الاستعراض.

يمكنك العثور على قائمة من أسماء الشوارع في الولايات المتحدة من مكتب التعداد ولكنه مدفون داخل الوحش datafile

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top