JS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר
-
יש לי טבלה שנרשמה אליה דרך הטלפון או באתר והיה שדה אחד לכתובת.
כעת עלה צורך לפצל את זה.
אני מנסה לבנות ביטוי נכון לבצע זאת.
יש כאן מורכבות א. לעצם הביטוי.
ב. אני הורדתי את הקובץ ערים ורחובות בישראל מכאן
ואני מנסה להצליב שמות ערים ורחובות לתוצאות נכונות.
ג. לפעמים מופיע 31/11 ולפעמים 31 על 11 ולפעמים 31 דירה 11 ולפעמים רק 31.
הקוד שהתחלתי לכתוב והסתבכתי:
ד. יכול להיות מישהו שגר ברחוב ירושלים שבזכרון יעקב ומישהו שגר ברחוב זכרון יעקב בירושלים.
ה. יש רחוב נתיבות המשפט במודיעין עילית ויש אתהעיר נתיבותחשבתי להתחיל כך, אם אני מוצא תאימות לשם העיר, תאימות אחת בלבד אני יתקדם לחפש רחוב בעיר מתוך הרחובות לעיר זו
ואם אין שום תאימות??
ואם יש שתי תאימויות (כגון זכרון יעקב ירושלים)בנוסף התמודדתי שהוא היה נותר לי גם ערים שבתור מילה כגון משפחת "טומלדור" נתן לי תוצאה של עיר בשם "דור" ולכן הוספתי איזה נוסחה שתתן לי רק תחילת או סף משפט או שיש רווח לפני/אחרי
רק שאז אני מקבל את שם העיר עם רווח בהתחלה או בסוף.להלן הקוד שהתחלתי
let Cities = fs.readFileSync('D:\\Dropbox\\משאבים פרוייקטים\\temp\\9ad3862c-8391-4b2f-84a4-2d4c68625f4b.csv', 'utf8'); //הקובץ של ערים ורחובות let Cities_array = Cities.split('\r\n').map(item => item.split(',').map(x => x.trim())); Cities_array = _.groupBy(Cities_array, '1'); let Cities_array_keys = Object.keys(Cities_array); let siteReg = new RegExp(Cities_array_keys.map(x => {return `((\\s|^)${x}(\\s|$))`}).join('|'), 'gi'); console.log(siteReg); (async () => { let Contacts = await database.selectSQL('SELECT * FROM ContactsDay limit 100').catch(console.error); for (let i in Contacts) { const contact = Contacts[i]; let address = contact.address; //split address to street, buildingNumber, ApartmentNumber, City let street; let buildingNumber; let ApartmentNumber; let City; let site = address.match(siteReg); console.log(address) console.log(site) if (site && site.length > 0){ } else { } } })();
דוגמאות של כתובות:
גבעת זאב יחיעם 10 כרמיאל ירושלים ראשי 73 דירה 8 מודיעין עילית קרית ספר ישעיהו 20 ירושלים שמות ברמן נתיבות המשפט 72 מודיעין עילית קרית ספר דירה 3 השלושה 11 בני ברק ירושלים אור שרגא 19 על 5 ורונה שיש hotel canal 13 בני ברק רחוב צבי הרלינג 13 דירה 11 צפת רחוב חזון דוד 1 דירה 98 מודיעין עילית חנה כהן טרומפלדור הישיבה 9 ירושלים רחוב יהודה הנשיא 10 אשדוד נחל אוריה 3 דירה 9 בית שמש מודיעין עילית חפץ חיים 11 דירה 4 חניתה 77 נוה שאנן חיפה רשי 11 אלעד רמבם 19 דירה 13 חיים עם קריאת ספר רחוב יהושע 33 בני ברק דירה 21 בני ברק רחוב רש"י 11 דירה 4 יהושועה 33 בני ברק קומה 6 דירה 21 נתיבות המשפט 58 מודיעין עילית קרית ספר ירושלים רמות א טללים 24 ג רבי עקיבא 24 דירה 2 קומה 0 מודיעין ברכפלד רחוב מסילת יוסף 19 על 19 מודיעין עילית קרית ספר ירושלים פרנק 7 רשבי 51 דירה 17 מודעין עילית ברכפלד אלעד התור 3 דירה 6 רחוב זווין 12/4 נווה יעקב ירושלים מודיעין עילית רחוב אור החיים 11 דירה 13 מודיעין עילית קרית ספר נתיבות המשפט 81 דירה 13 רחוב מיכאל 56 דירה 4 חיפה ירושלים מודיעין עילית קרית ספר אבני נזר 26 דירה 9 מודיעין עילית שדי חמד 8 דירה 9 קרפ תל ציון מקור ברוך 9 ל 4 סנהדריה המורחבת 131 75 ירושלים רמבם 39 קומה שלישית דירה 9 עיר בני ברק רמבם 29 בית שמש רחוב נחל ניצנים 1 דירה 4 קרית ספר נתיבות המשפט 87 - 2 ברסלב 17/7 בני ברק סורג עד 23 מודיעין עילית בני ברק רחוב ישמח משה 12 דירה מספר 6 ירושלים רמת גימל רחוב קהילות שום בניין 6 דירה 36 ירושלים רחוב רוזנבלט 16 על 2 בני ברק רחוב חזון איש 27 דירה 4 חזו"א 12/3 בית שמש ירושלים דובב מישרים 3 מצליח 4 דירה 9 בני ברק מרומי שדה 19 דירה 17 מודיעין עילית יואל 25 מודיעין עילית יונתן בן עוזיאל 20 אלעד אור החיים 14 דירה 20 מודיעין עילית בני ברק הרב שך 58 דירה 6 מודיעין עילית רחוב חזון איש 5 דירה מספר 8 רחוב נויפלד 9 קרית הרצוג בני ברק מעלות דפנה 122 ירושלים בני ברק רחוב רמבם 8 סנהדריה המורחבת 114 ירושלים ירושלים חתם סופר 4 רחוב חניתה 81 מודיעין עילית 2 דירה 12 ירושלים רחוב הדף היומי 619 דירה 4 נתיבות המשפט 87 דירה 22 מודיעין עילית נתיבות המשפט 22 דירה 8 חבקוק 19 דירה 22 מודיעין עילית שושנים 136/2 כרמיאל חיפה גלבוע 19 ניחובסקי 10 בני ברק בני ברק רחוב רבי עקיבא 13 דירה 7 מרומי שדה 34 דירה 4 מודיעין עילית צומת סמויה בית שמש חזון איש 12 עד 8 אבני נזר 11 מודיעין עילית רחובות עזרא 48 ירושלים רוממה רחוב פתח תקווה 21 ירושלים רמת שלמה רחוב אגרות משה 7 דירה 7 גני הדר פתח תקווה מנחת שלמה 8 שד' קונטיקט 5 עפולה צבי 11 בני ברק בית שמש בן קיסמא 15 דירה 16 מודיעין עילית נתיבות המשפט 59/24 ערבות הנחל 1 על 10 בית שמש צבי 11 קומה שלישית דירה 11 בני ברק צבי 15 מודיעין עילית רשבי 18 דירה 25
-
@חוקר יש לי תוכנית מסובכת לומר לך מה לעשות,
ואז אני נזכר שאני אישית משתמש בAPI של גוגל כאני צריך כאלה דברים.זה ממש פשוט, והרבה יותר מדוייק
https://maps.googleapis.com/maps/api/geocode/json?key=XXXXXX&language=he&result_type=street_address&address=הרצל 17התוצאה נראית ככה:
{ "results" : [ { "address_components" : [ { "long_name" : "17", "short_name" : "17", "types" : [ "street_number" ] }, { "long_name" : "הרצל", "short_name" : "הרצל", "types" : [ "route" ] }, { "long_name" : "תל אביב-יפו", "short_name" : "תל אביב-יפו", "types" : [ "locality", "political" ] }, { "long_name" : "מחוז תל אביב", "short_name" : "מחוז תל אביב", "types" : [ "administrative_area_level_1", "political" ] }, { "long_name" : "ישראל", "short_name" : "IL", "types" : [ "country", "political" ] } ], "formatted_address" : "הרצל 17, תל אביב-יפו, ישראל", "geometry" : { "location" : { "lat" : 32.0616741, "lng" : 34.7703751 }, "location_type" : "ROOFTOP", "viewport" : { "northeast" : { "lat" : 32.06301403029149, "lng" : 34.7716624802915 }, "southwest" : { "lat" : 32.0603160697085, "lng" : 34.7689645197085 } } }, "place_id" : "ChIJv09_XJxMHRURWh4zBRBM2y0", "plus_code" : { "compound_code" : "3Q6C+M5 תל אביב-יפו, ישראל", "global_code" : "8G4P3Q6C+M5" }, "types" : [ "street_address" ] } ], "status" : "OK" }
אם אתה מתעקש על אלגוריתם,
אני מניח שכל הערים נמצאות בקצה המחרוזת.
אתה צריך לטעון את כל הערים למערך, ולבדוק עם endsWith אם המחרוזת מסיימת בטקסט הרצוי. אם יש רק תוצאה חיובית אחת זו העיר, אם יש יותר מאחת, צריך לעבור לבדוק אם הרחוב קיים שם וזה על ידי רג'קס שמוריד כל מספר וסימן אחורה, עד הטקסט הקודם ואז לולאה על הרחובות המתאימים לאותה העיר. בקיצור זה לא עבודה נחמדה. -
@חוקר כדי לעשות סדר, אני מציע לפצל את הבעיה
ל 1) תיאור הדרישה 2) האלגוריתם, 3) המימוש.
החלק הקשה יותר הוא האלגוריתם, המימוש אמור להיות די קל.
חלק מהשאלות שלך למעלה קשורות יותר לחלק המימוש. ולכן בשלב הראשון הם פחות רלוונטיים. אתה החלטת ללכת על ביטוי רגולרי וזה גרם לחלק מהשאלות אם הבנתי נכון. אולי זה לא כיוון נכון כלל במקרה הזה -
@dovid אמר בJS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר:
API של גוגל כאני צריך כאלה דברים.
איך אני יכול להשיג KEY לזה? איזה סוג רשיון זה?
@dovid אמר בJS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר:
אני מניח שכל הערים נמצאות בקצה המחרוזת.
ואני מניח שלא התעמקת לבדוק את הדוגמאות שצירפתי
מדובר בערבול נתונים, ובפרט שזה מאוד הרבה מהקלטה בטלפון.
יש את כל סוגי הפורמטים, בתחילה בסוף ובאמצע.@yossiz אמר בJS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר:
אתה החלטת ללכת על ביטוי רגולרי
אכן לא חשבתי על רעיון אחר, אשמח לשמוע.
-
@חוקר אמר בJS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר:
האם זה קולט מחרוזות בצורה כזו?
נתיבות המשפט 89 מודיעין עילית קרית ספר דירה 75{ "results" : [ { "address_components" : [ { "long_name" : "75", "short_name" : "75", "types" : [ "subpremise" ] }, { "long_name" : "89", "short_name" : "89", "types" : [ "street_number" ] }, { "long_name" : "נתיבות המשפט", "short_name" : "נתיבות המשפט", "types" : [ "route" ] }, { "long_name" : "מודיעין עילית", "short_name" : "מודיעין עילית", "types" : [ "locality", "political" ] } ], "formatted_address" : "75, נתיבות המשפט 89, מודיעין עילית", "geometry" : { "location" : { "lat" : 31.924848, "lng" : 35.0412809 }, "location_type" : "RANGE_INTERPOLATED", "viewport" : { "northeast" : { "lat" : 31.9262777802915, "lng" : 35.0426899802915 }, "southwest" : { "lat" : 31.9235798197085, "lng" : 35.0399920197085 } } }, "place_id" : "EiY3NSwgTmV0aXZvdCBIYU1pc2hwYXQgODksIE1vZGknaW4gSWxpdCI4GjYKMBIuChQKEglXx1yJntICFRFeR3jBEGaDshBZKhQKEgmL6UPhodICFRH-o2JfnBeBwBICNzU", "types" : [ "subpremise" ] } ], "status" : "OK" }
@חוקר אמר בJS ביטוי רגולארי לפיצול כתובת לעמודות רחוב בית/דירה ועיר:
ואיך אני יכול להשיג KEY לזה? איזה סוג רשיון זה?
כמו כל הAPI של גוגל.
נכנס בקונסול למפתחים, עושה enable לספריית geocoding ומייצר מפתח API.
הנה התיעוד https://developers.google.com/maps/documentation/geocoding/start
זה עולה עלות כל שהיא אחרי אלף בקשות יומיות כמדומני, לא משהו שירושש אותך. -
דוקא בגלל שזה מחרוזות לא שיטתיות, הסיכוי של האלגוריתם של גוגל לזהות אותן נכון גדול לאין שיעור מאלגוריתם שתבנה.
כדי לבנות בעצמך משהו יעיל שמוכוון למטרה שלך וישיג תוצאות טובות יותר מגוגל, תצטרך כל כך הרבה התאמות ותיקונים שזה יהיה כבר חצי עבודה ידנית (בהנחה שיש לך לכל היותר עשרות אלפי כתובות, אם לא הרבה פחות).המחירים של גוגל: הם נותנים זיכוי חינם של 200$ לחודש בAPI שלהם. לכל סוג בקשה יש מחיר אחר. למיטב זכרוני חישבתי בעבר על סוג הבקשה הזה שהוא מספיק ל28 אלף בקשות בחודש.