我有一个包含联系人的 CSV 文件,我想将其导入在线联系人列表。
不幸的是,CSV 文件只有一列用于存储全名,并且没有区分“名字”和“姓氏”列,而这正是我需要的。我想知道是否有 Excel 函数可以进行拆分(或者任何其他建议,考虑到我是 C# 开发人员,但不懂 Excel VB 脚本)。
好消息是,“全名”列确实总是以大写的姓氏开头,然后是驼峰式名字,姓氏可能包含撇号,名字和姓氏都可以包含多个单词。以下是一些示例:
1) LASTNAME Firsname; Other data; ...
2) LASTNAME LASTNAME Firsname; Other data; ...
3) LASTNAME' LASTNAME Firsname; Other data; ...
4) LASTNAME' LASTNAME LASTNAME Firsname Firstname; Other data; ...
我需要将其转换为:
1) Lastname; Firsname; Other data; ...
2) Lastname Lastname; Firsname; Other data; ...
3) Lastname' Lastname; Firsname; Other data; ...
4) Lastname' Lastname Lastname; Firsname Firstname; Other data; ...
感谢您的帮助。
答案1
我假设您已经导入了 CSV 文件,并且姓名列表位于 A 列。
此公式创建一个“辅助”列,其中包含名字最后一个字母的位置:
=MATCH(1,(CODE(MID(A2,ROW(A$1:A$50),1))>96)*(CODE(MID(A2,ROW(A$1:A$50),1))<123),0)-3
CTRLShiftEnter这是一个数组公式,必须用而不是 来输入Enter。如果输入正确,公式栏中的公式将被花括号括起来。此公式已从下表中的 B2 向下填充。
怎么运行的: MID()
创建名称中所有字母的数组(最多 50 个字母)。ROW()
用于生成从 1 到 50 的数字列表。因此,如果您的任何名称都可以更长超过 50 个字符,则应A$50
根据需要增加字数。
CODE()
将字母数组转换为其 ASCII 代码。比较>96
并<123
检查小写 ASCII 字母,同时将数组转换为 True/False 值,其中任何小写字母都为 True。
乘法相当于逻辑运算AND()
,并将 True/False 值转换为 1 和 0。最后,MATCH()
找到该数组中第一个 1 的位置,即姓名中第一个小写字母的位置。减去 3 可确定名字的最后一个字母。
现在,使用辅助列,可以在 C 列中列出姓氏:
=PROPER(LEFT(A2,B2))
这将把 A 列的全大写部分转换为 Excel 所称的“正确”大小写,这似乎与“驼峰式”大小写相同。
名字列在 D 列中:
=RIGHT(A2,LEN(A2)-B2-1)