组合姓氏的前两个字母和姓氏的前两个字母


9

我有一个用户名电子表格。

名字和姓氏在column的相同单元格中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结果。



有任何答案可以解决这个问题吗?(如果是这样,您可以通过单击帖子左侧的对勾标记将其标记为“答案”。)
BruceWayne

Answers:


15

是; 假设每个人只有名字和姓氏,并且总是用空格隔开,则可以使用以下代码:

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

我只能根据您提供的所有这些假设做出此回答。

或者,如果您仍然希望包含空格:

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

2
@prweq没有问题,如果对您
有用

最简单,最容易理解的解决方案。(好吧,除了使用FIND()代替;- 以外SEARCH()),由于您假设总是有一个空格分隔符,因此您的第二个公式可以简化为=LEFT(A1,2)&MID(A1,SEARCH(" ",A1),3)
robinCTS

4
@RajeshS我知道。这就是为什么我的答案以assuming each person only has a First and Last name
PeterH '18

2
虚假的程序员相信名字 ; 并不是说如果您的软件没有国际影响,一开始就处理所有这些情况是有意义的
Aaron

1
我建议TRIM(LEFT(A1,2))以防万一他们的名字只有一个字母,但是手动检查那些特殊情况也可能很容易。
Engineer Toast

11

为了解决问题,这里提供了一个解决方案,该解决方案将返回姓氏的前两个字符和姓氏的前两个字符,同时还要返回中间名。

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

在此处输入图片说明

感谢@Kyle作为公式的主要部分


1
您击败了我;-)(已经很午夜了,我需要睡觉-打算以后再添加到我的答案中。)您的公式的一个小改进是使用单个~而不是四个。如果您担心Tilda可能用作名称(!)的一部分,或者更可能是偶然键入的,请使用任何键盘上都没有出现的字符。我更喜欢使用§是另一个好人。
robinCTS

@BruceWayne,您的公式更加称职,因为它仅访问Firts,并且姓氏忽略了中间名,
Rajesh S

@RajeshS带有西班牙名字的人怎么办?例如前F1赛车手Fernando AlonsoDíaz 有1个姓氏,2个姓氏且没有中间名?(或者甚至是国王费利佩·胡安·帕勃罗· 阿方索·德·托多斯·洛斯·桑托斯·德·
博尔班

2
@Chronocidal现在,我们正在深入程序员对名称的信任之
BruceWayne

1
@robinCTS-大家好!我从另一个答案(已编辑)中获得了公式,并且并没有真正深入地研究过。感谢您的提示!
BruceWayne

9

这是另一种方式

工作表的屏幕截图

  • 一个名字
  • B- =CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))

您可以更进一步,通过合并删除所有多余的列=CONCATENATE(LEFT(A1,2),LEFT(RIGHT(A1,(LEN(A1)-FIND(" ",A1))),2))
PeterH

是的,我过了一会儿就做到了!
斯蒂斯

是的,我注意到您编辑了答案,尼斯答案!
PeterH '18

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


*我将保留一个字母姓氏(例如T先生)的情况,作为读者的练习。

暗示: =solution &IF(MID(A1,LEN(A1)-1,1)=" ", single_char, "")


1
与往常一样,您的答案似乎来自Excel的高级用户指南!如果您早些发布,这将是投票最多的答案!
PeterH

@PeterH感谢您的补充。遇到热门网络问题列表后,我才偶然发现该问题,所以我参加聚会有点迟了;-)
robinCTS 18/12/11

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的解决方案,已修改为也可以使用单个名称(在这种情况下,结果只是名称的前两个字符)。


注意:如果输入,则经过修饰的公式实际上会起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.