Объединение первых двух букв от имени и первых двух букв от фамилии

9

У меня есть таблица с именами пользователей.

Имя и фамилия находятся в одной ячейке столбца A.

Существует ли формула, которая объединит первые две буквы имени (первое слово) и первые две буквы фамилии (второе слово)?

Например John Doe, должен стать JoDo.

Я старался

=LEFT(A1)&MID(A1,IFERROR(FIND(" ",A1),LEN(A1))+1,IFERROR(FIND(" ",SUBSTITUTE(A1," ","",1)),LEN(A1))-IFERROR(FIND(" ",A1),LEN(A1)))

но это дает мне JoDoeв результате.

prweq
источник
2
Основное чтение: программисты лжи верят в имена
StackOverthrow
Любой из ответов делает свое дело? (Если это так, не могли бы вы отметить его как Ответ, нажав на флажок слева от сообщения.)
BruceWayne

Ответы:

15

Да; при условии, что у каждого человека есть только имя и фамилия, и это всегда разделяется пробелом, вы можете использовать ниже:

=LEFT(A1,2)&MID(A1,SEARCH(" ",A1)+1,2)

Я мог бы основать этот ответ только на этих предположениях, поскольку это все, что вы предоставили.

Или, если вы хотите, чтобы место все еще было включено:

=LEFT(A1,2)&" "&MID(A1,SEARCH(" ",A1)+1,2)
PeterH
источник
2
@prweq нет никаких проблем, примите это как правильное, если это работает для вас
PeterH
Самое простое и легкое для понимания решение. (Хорошо, за исключением использования FIND()вместо SEARCH();-)) Поскольку вы предполагаете, что всегда есть разделитель пробелов, ваша вторая формула может быть упрощена до=LEFT(A1,2)&MID(A1,SEARCH(" ",A1),3)
robinCTS
4
@RajeshS Я знаю. Вот почему мой ответ начинается сassuming each person only has a First and Last name
PeterH
2
Программисты лжи верят в имена ; не то, чтобы было бы разумно обрабатывать все эти случаи с самого начала, если ваше программное обеспечение не имеет международного распространения
Аарон
1
Я предлагаю TRIM(LEFT(A1,2))только в том случае, если их имя имеет только одну букву, но может быть достаточно легко проверить эти специальные случаи вручную.
Инженер Тост
11

И в заключение, вот решение, которое возвращает первые два символа имени и первые два символа фамилии, но также учитывает отчество.

=LEFT(A1,2)&LEFT(MID(A1,FIND("~~~~~",SUBSTITUTE(A1," ","~~~~~",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+1,LEN(A1)),2)

введите описание изображения здесь

Спасибо @Kyle за основную часть формулы

Брюс Уэйн
источник
1
Вы победили меня ;-) (Было уже далеко за полночь, и мне нужно поспать - я планировал добавить это к своему ответу позже.) Небольшое улучшение вашей формулы будет заключаться в использовании одного ~вместо четырех. Если вы обеспокоены тем, что Tilda может использоваться как часть имени (!) Или, что более вероятно, случайно напечатано, просто используйте символ, который не отображается ни на одной клавиатуре. Я предпочитаю использовать §. еще один хороший.
robinCTS
@BruceWayne ,, ваша Формула более компетентна ,,, так как она получает доступ только к Фертам и Фамилии игнорирует Отчество ,,, Проголосовал ☺
Раджеш С
@RajeshS А как насчет людей с испанскими именами , таких как бывший пилот Ф1 Фернандо Алонсо Диас, у которого есть 1 имя, 2 фамилии и никаких отчеств? (Или даже король Фелипе Хуан Пабло Альфонсо де Тодос лос Сантос де Борбон и де Гресия ?)
Хроноцидный
2
@Chronocidal теперь мы идем по кроличьей норе того, что программисты считают именами
BruceWayne
1
@robinCTS - Хороший звонок! Я получил формулу из другого ответа (отредактировано в), и на самом деле не слишком глубоко копал. Спасибо за советы!
Брюс Уэйн
9

Это еще один способ ...

Снимок экрана рабочего листа

  • Имя
  • Б - =CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
Stese
источник
Вы можете пойти еще дальше и удалить все эти лишние столбцы, объединив их=CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
PeterH
Да, я сделал это несколько минут спустя!
Stese
да, я заметил, что вы отредактировали ответ, хороший ответ!
PeterH
5

Прежде всего, я хотел бы сказать, что ответ PeterH является самым простым и легким для понимания. (Хотя я предпочитаю использоватьFIND() вместо SEARCH()- ввод менее двух символов помогает избежать RSI ;-))

Альтернативный ответ , что ни применение MID(), LEFT()ни RIGHT(), но вместо этого используется , REPLACE()чтобы удалить ненужные части названия выглядит следующим образом :

=REPLACE(REPLACE(A1,FIND(" ",A1)+3,LEN(A1),""),3,FIND(" ",A1)-2,"")

Объяснение:

Внутренний REPLACE(A1, FIND(" ",A1)+3, LEN(A1), "")удаляет символы из третьего символа фамилии и далее, в то время как внешний удаляет символы из третьего символа имени до и включая пробел.REPLACE(inner_replace, 3, FIND(" ",A1)-2, "")


Приложение 1:

Приведенная выше формула также может быть адаптирована для учета одного отчества:

=REPLACE(REPLACE(A1,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))+3,LEN(A1),""),3,IFERROR(FIND(" ",A1,FIND(" ",A1)+1),FIND(" ",A1))-2,"")

заменив FIND(" ",A1)на IFERROR(FIND(" ",A1,FIND(" ",A1)+1), FIND(" ",A1)).

FIND(" ", A1, FIND(" ",A1)+1) находит второй пробел (запуская поиск пробела после первого пробела) или ошибки в противном случае.
IFERROR(find_second_space, FIND(" ",A1))находит первый пробел, если второго пробела нет.


Эта (длинная) версия допускает любое количество отчеств:

=REPLACE(REPLACE(A1,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))+3,LEN(A1),""),3,FIND("§",SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ",""))))-2,"")

В этом случае FIND(" ",A1)заменяется на FIND("§", SUBSTITUTE(A1," ","§",LEN(A1)-LEN(SUBSTITUTE(A1," ","")))).

LEN(A1)-LEN(SUBSTITUTE(A1," ",""))считает количество пробелов заменяет последний пробел на . находит первое, что совпадает с поиском последнего пробела.
SUBSTITUTE(A1, " ", "§", count_of_spaces)§
FIND("§", last_space_replaced_string)§

( §Конечно, его можно заменить любым символом, который гарантированно не существует в строке полного имени. Использовать более общую, более безопасную альтернативу CHAR(1).)


Обратите внимание, что ответ BruceWayne, конечно же, является самым простым и легким для понимания решением, допускающим любое количество отчеств . Ну, это было. Пока я не отправил другой мой ответ , то есть ;-)


Приложение 2:

Все решения могут быть адаптированы для обработки только одного имени (если требуется результат из четырех символов), заключая их в IFERROR()функции, например:

=IFERROR(solution, alternate_formula)

Обратите внимание, что приведенное выше является формулой общего случая, и может оказаться возможным сделать более эффективную модификацию конкретного решения. Например, если в случае одного имени требуется объединить первые две буквы с последними двумя буквами, ответ PeterH может быть более эффективно адаптирован следующим образом:

=LEFT(A1,2)&MID(A1,IFERROR(SEARCH(" ",A1)+1,LEN(A1)-1),2)


Чтобы учесть случай использования одной буквы, имени или инициала (при условии, что в качестве второго символа пробел или точка недопустимы), для любого решения можно использовать следующее:

=SUBSTITUTE(SUBSTITUTE(solution, " ", single_char), ".", single_char))

Обратите внимание, что один символ может быть жестко запрограммирован или рассчитан по имени. (Или используйте ""для удаления пробела или точки.)


Наконец, если вам действительно нужно учитывать случай, когда полное имя состоит только из одного символа (!), Просто оберните формулу только для одного имени другой IFERROR() . (Предполагая, конечно, что альтернативная формула не учитывает этот особый случай.)


Приложение 3:

Наконец, наконец (нет, действительно * ;-)), чтобы обслуживать несколько последовательных и / или начальных / конечных пробелов, используйте TRIM(A1)вместо A1.


* Я оставлю дело для одной буквы фамилии, как г-н Т, в качестве упражнения для читателя.

Подсказка: =solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")

robinCTS
источник
1
Как всегда ваши ответы выглядят так, как будто они из расширенного руководства пользователя Excel! Это был бы самый популярный ответ, если бы вы опубликовали его раньше!
PeterH
@PeterH Спасибо за дополнение. Я наткнулся на вопрос только после того, как он попал в список «Горячих сетевых вопросов», поэтому я немного опоздал на вечеринку ;-)
robinCTS
2

Основываясь на этом ответе , вот элегантное решение, которое работает с любым количеством отчеств:

=LEFT(A1,2)&LEFT(TRIM(RIGHT(SUBSTITUTE(A1," ",REPT(" ",LEN(A1))),LEN(A1))),2)

Объяснение:

SUBSTITUTE(A1, " ", REPT(" ",LEN(A1)))заменяет пространство между словами пробелами, равными по числу длине всей строки. Использование длины строки, а не произвольно большого числа гарантирует, что формула работает для любой длины строки, и означает, что она делает это эффективно.

RIGHT(space_expanded_string, LEN(A1))извлекает самое правое слово с предваряющей группой пробелов. *

TRIM(space_prepended_rightmost_word) извлекает самое правое слово.

LEFT(rightmost_word, 2) извлекает первые два символа самого правого слова (фамилия).


* Предостережение: если имя пользователя может содержать конечные пробелы, вам необходимо заменить первый аргумент SUBSTITUTE(), т. Е. A1, На TRIM(A1). Ведущие пробелы и несколько последовательных пробелов между словами обрабатываются правильно только с помощью A1.


Исправление вашей попытки

При более внимательном рассмотрении вашего попытанного решения создается впечатление, что вы были очень близки к рабочей формуле для объединения первых двух букв первого слова (т.е. первого имени) и первых двух букв второго слова, если оно существовало.

Обратите внимание, что если имя пользователя будет содержать отчества, исправленная формула будет неправильно захватывать первые две буквы от первого отчества, а не от фамилии (при условии, что вы действительно хотите извлечь их из фамилии).

Кроме того, если все имена пользователей состоят только из имени, имени или фамилии, то формула излишне усложняется и может быть упрощена.


Чтобы увидеть, как работает формула, и исправить ее, проще, если она предварительно подтверждена, например:

=
LEFT(A1,2) &
MID(
  A1,
  IFERROR(FIND(" ",A1), LEN(A1)) + 1,
  IFERROR(
    FIND(" ", SUBSTITUTE(A1," ","",1)),
    LEN(A1)
  )
  - IFERROR(FIND(" ",A1), LEN(A1))
)


Чтобы понять, как это работает, сначала посмотрите, что происходит, если в A1нем нет пробелов (т.е. оно содержит только одно имя). Все IFERROR()функции оценивают свои вторые аргументы, так как FIND()возвращает #VALUE!ошибку, если строка поиска не найдена в целевой строке:

=
LEFT(A1,2) &
MID(
  A1,
  LEN(A1) + 1,
  LEN(A1)
  -LEN(A1)
)

Третий аргумент MID()оценивается как ноль, поэтому выходные данные функции ""и результат формулы - это первые два символа одного имени.


Теперь посмотрим, когда есть ровно два имени (то есть ровно один пробел). Первая и третья IFERROR()функции оценивают свои первые аргументы, а вторая - второй аргумент, поскольку FIND(" ", SUBSTITUTE(A1," ","",1))пытается найти другое пространство после удаления первого и только одного:

=
LEFT(A1,2) &
MID(
  A1,
  FIND(" ",A1) + 1,
  LEN(A1)
  - FIND(" ",A1)
)

Ясно, MID()что второе слово (то есть фамилия) возвращается полностью, а результатом формулы являются первые два символа имени, за которыми следуют все символы фамилии.


Для полноты картины мы также рассмотрим случай, когда есть как минимум три имени, хотя теперь должно быть совершенно очевидно, как исправить формулу. На этот раз все IFERROR()функции оценивают свои первые аргументы:

=
LEFT(A1,2) &
MID(
  A1,
  FIND(" ",A1) + 1,
  FIND(" ", SUBSTITUTE(A1," ","",1))
  - FIND(" ",A1)
)

Это немного менее ясно, чем это было в предыдущем случае, но MID()возвращает ровно все второе слово (т.е. первое отчество). Таким образом, результатом формулы являются первые два символа имени, за которыми следуют все символы первого отчества.


Очевидно, что исправление должно использовать, LEFT()чтобы получить первые два символа MID()вывода:

=
LEFT(A1,2) &
LEFT(
  MID(
    A1,
    IFERROR(FIND(" ",A1), LEN(A1)) + 1,
    IFERROR(
      FIND(" ", SUBSTITUTE(A1," ","",1)),
      LEN(A1)
    )
    - IFERROR(FIND(" ",A1), LEN(A1))
  ),
  2
)


Облегчение я уже упоминал выше, чтобы заменить LEFT(MID(…,…,…), 2)с MID(…,…,2):

=
LEFT(A1,2) &
MID(
  A1,
  IFERROR(FIND(" ",A1), LEN(A1)) + 1,
  2
)

или на одной строке:

=LEFT(A1,2)&MID(A1,IFERROR(FIND(" ",A1),LEN(A1))+1,2)

По сути, это решение PeterH, измененное для работы с отдельными именами (в этом случае результатом являются только первые два символа имени).


Примечание: предварительно введенные формулы действительно работают, если введены.

robinCTS
источник