Чего мне не хватает в этой функции Excel SEARCH (), чтобы добиться того, чего я хочу? - PullRequest
0 голосов
/ 27 ноября 2011

Я даже не знаю, принадлежит ли этот вопрос здесь или другому сайту 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, """) }")

1 Ответ

1 голос
/ 27 ноября 2011

Чтобы получить UnitSuiteAppt, используйте это: LEFT($D499,IFERROR(SEARCH("-",$D499),20)-1).

Чтобы получить StreeNumber, используйте это: MID($D499,IFERROR(SEARCH("-",$D499),20)+1,20).

Примечание. Значение по умолчанию - 20, максимальная длина искомого значения.

...