Я даже не знаю, принадлежит ли этот вопрос здесь или другому сайту StackExchange, поэтому прошу прощения, если я ошибаюсь '.
Я нормализую адреса с помощью Excel, чтобы после этого я мог вставить их в базу данных, к которой готов.
Давайте на лету возьмем несколько адресов (вымышленных):
1. 340 | 1st Street | MyCity
2. 2-648 | 2nd Avenue | AnotherCity
3. 102-648 | 2nd Avenue | MyCity
4. 8A-605 | Wilson Boulevard | MyCity
5. A45C-103¼ | Hunting Crescent | MyCity
То, чего я хочу достичь с помощью формулы Excel, выглядит следующим образом:
new Address() { StreetNumber=340, NumberSuffix=(NumberSuffixes)0, Street=streets.Single(s => s.Name == "1st Street"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="2", Street=streets.Single)s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "AnotherCity") }
, new Address() { StreetNumber=648, NumberSuffix=(NumberSuffixes)0, UniteSuiteAppt="102", Street=streets.Single(s => s.Name == "2nd Avenue"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=605, NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt="8A", Street=streets.Single(s => s.Name == "Wilson Boulevard"), City=cities.Single(c => c.Name == "MyCity") }
, new Address() { StreetNumber=103, NumberSuffix=(NumberSuffixes)1, UnitSuiteAppt="A45C", Street=streets.Single(s => s.Name == "Hunting Crescent"), City=cities.Single(c => c.Name == "MyCity") }
Моя фактическая формула Excel до сих пор выглядит следующим образом:
=CONCATENATE("new Address() { StreetNumber=", RIGHT($D499, LEN($D499)-SEARCH("-",$D499)), ", NumberSuffix=(NumberSuffixes)0, UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """, Street = streetsOfShawinigan.Single(s => s.Name == """, $E499, """), City = cities.Single(c => c.Name == ""Shawinigan"") }")
Проблема, с которой я сталкиваюсь, связана с этой частью формулы:
[...]UnitSuiteAppt=""", LEFT($D499, LEN($D499)-SEARCH("-",$D499)-2), """[...]
Кажется, что SEARCH () не работает одинаково от одной строки к другой, так как он будет работать безупречно для данной строки, а не для другой. Например, он может вернуть:
for 2nd address: [...]UnitSuiteAppt="2-"[...]
for third address: [...]UnitSuiteAppt="1"[...]
for fourth address: [...]UnitSuiteAppt="8A"[...]
for fifth address: [...]UnitSuiteAppt="A45"[...]
Это означает, что я хочу, чтобы первая часть перед символом тире имела строковое значение UnitSuiteAppt
, а часть после обязательна StreetNumber
. Первая часть, эта квартира, скажем, имеет переменную длину. Поэтому мне нужно изменить -2
на иногда -1
, а в других случаях на -3
, который, кажется, зависит от длины квартирной части адреса, что, в конце концов, имеет смысл. Моя точка зрения заключается в том, что SEARCH () всегда должен возвращать индекс «-», и, как таковой, он, кажется, не всегда работает правильно, в противном случае, это я, кто еще не совсем понял, как это работает, что я подозреваю серьезно. ; -)
Любая помощь приветствуется.
Заранее благодарим за ваше драгоценное время!
EDIT
Я хотел бы включить полное решение, которое Рэйчел помогла мне найти с ее очень полезным и точным ответом. Итак, вот полная формула.
=CONCATENATE("new Address() { StreetNumber=", MID($D21, IFERROR(SEARCH("-", $D21), 0)+1, 5), ", NumberSuffix=(NumberSuffixes)0, ", IF(IFERROR(FIND("-", $D21, 1), "")="", "", CONCATENATE("UnitSuiteAppt=""", LEFT($D21, FIND("-", $D21, 1)-1), """, ")), "Street=streetsOfShawinigan.Single(s => s.Name == """, $E21, """), ", "City=cities.Single(c => c.Name == """, $F21, """) }")