Вы определенно находитесь на правильном пути с функциями RIGHT()
и SUBSTITUTE()
.
Давайте пройдемся по процессу обобщения и объединения формул.
Для этого мы будем работать с предложением What to do?
в A1
ваша RIGHT()
формула в B1
, и ваша SUBSTITUTION()
формулы в C1
. Таким образом, ваши формулы будут =RIGHT(A1,3)
и =SUBSTITUTE(B1,"?","")
:
Шаг 1
Нам нужно обобщить:
<1> RIGHT(A1,3)
3
, который является длиной последнего слова, включая любую следующую пунктуацию, должен быть изменен для работы с любым предложением. Один из способов сделать это состоит в том, чтобы понять, что длина последнего слова может быть вычислена из длины предложения и основанного на единице индекса последнего пробела.
Для нашего примера длина равна 11, а индекс последнего пробела равен 8,
What to do?
↑ ↑
12345678 11
и 11 - 8 → 3
Длина может быть рассчитана с помощью:
<2> LEN(A1)
Индекс немного сложнее, поскольку FIND()
может использоваться только для поиска индекса первого пробела, но не любого другого. Тем не менее, мы можем использовать SUBSTITUTE()
, чтобы помочь , как это позволяет заменить любое конкретное пространство. Если мы изменим последний пробел на символ, которого нет в другом месте предложения, мы могли бы затем использовать FIND()
чтобы найти его, и, следовательно, индекс.
Формула для замены:
<3> SUBSTITUTE(A1," ","§",2)
где 2
- номер вхождения последнего пробела, то есть 2-го пробела, и, надеюсь, §
не существует.
Затем мы можем использовать <3>
чтобы найти индекс последнего пробела следующим образом:
<4> FIND("§",SUBSTITUTE(A1," ","§",2))
Но как мы решаем 2
? Это немного сложно. Обратите внимание, что номер вхождения последнего пробела в предложении совпадает с количеством пробелов в предложении.
Количество может быть рассчитано путем удаления пробелов из предложения. Это уменьшает его длину на счет. Из этой и исходной длины мы можем получить количество:
<5> LEN(A1)-LEN(SUBSTITUTE(A1," ",""))
Включение этого обратно в <4>
приводит к формуле для индекса последнего пробела:
<6> FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
Вычитание этого из <2>
приводит к длине последнего слова:
<7> LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))
Подключение <7>
обратно к <1>
приводит к обобщенному
<8> RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))))
Шаг 2
Нам нужно обобщить:
<9> SUBSTITUTE(B1,"?","")
Теперь, так как SUBSTITUTE()
возвращает неизмененную целевую строку, если в ней не может быть найдена строка поиска, мы можем "связать" более одной этой функции, чтобы удалить несколько возможных знаков пунктуации. Например, чтобы также удалить !
мы бы сделали это:
<10> SUBSTITUTE(<9>,"!","")
Подключение <9>
к <10>
дает:
<11> SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!","")
Поскольку есть только три знаки препинания в конце ?
!
и .
(Я надеюсь), <10>
можно полностью обобщить на это:
<12> SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B1,"?",""),"!",""),".","")
Шаг 3
Объединение двух формул - это простой вопрос замены B1
в <12>
на <8>
, что приводит к решению:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(RIGHT(A1,LEN(A1)-FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))),"?",""),"!",""),".","")
Заметки:
Если в конце предложения нет знаков препинания (как в случае предложения 21, показанного на скриншоте), функции SUBSTITUTE()
фактически ничего не делают, и последнее слово корректно возвращается.
Если предложения в вашем наборе данных могут оканчиваться каким-либо другим символом, скажем, как :
формула может быть легко изменена для удовлетворения этого.
Наконец, поскольку между номером предложения и первым словом всегда есть пробел, нет необходимости проверять ошибки в формуле. Однако она возвращает ошибку , если нет приговора.