Excel 文本处理:拆分姓名、提取手机号、清洗脏数据

2026-10-21 8 次浏览 Excel 函数
从系统导出的数据,十有八九是"一坨"——姓名工号挤在一格、手机号带空格、大小写混乱。这篇讲 LEFT/MID/RIGHT/FIND/TEXTSPLIT 怎么把它们拆干净。
=LEFT(文本, 取几个字符) =RIGHT(文本, 取几个字符) =MID(文本, 从第几个开始, 取几个)
用途从一段文字里,切出你要的那一部分。

从系统里导出的数据,十有八九长这样:

张三-技术部-13812345678
李四-市场部-13987654321

姓名、部门、手机号全挤在一个格子里。

或者长这样:

  北京市朝阳区  (前面有空格)

看起来一样,其实不一样。

这就是文本函数要解决的事。

关键文本切出来常要参与计算或判断,配合 IF 可以自动打标签,配合 日期函数 能把身份证号里的生日算成年龄。

先认清三个切刀

函数作用例子结果
`LEFT`从左往右切`LEFT("张三-技术部", 2)`张三
`RIGHT`从右往左切`RIGHT("张三-技术部", 3)`技术部
`MID`从中间某处切`MID("张三-技术部", 4, 3)`技术部
关键关键认知:三个函数都是按"字符个数"切的。所以你必须先知道"切几个"。

那如果不知道呢?就用 FIND 先找位置。

FIND:先找分隔符的位置

=FIND("-", A2)

在 A2 里找第一个 `-`,返回它的位置。

`张三-技术部-13812345678` 里,第一个 `-` 在第 3 个字符位置。

有了这个位置,就能算"该切几个"了。

提取"第一个横线之前"的内容(姓名)

=LEFT(A2, FIND("-", A2)-1)

逻辑:找到横线在第 3 位,那么姓名就是左边 2 个字符(3−1)。

`-1` 是因为横线本身不算。

提取"最后一个横线之后"的内容(手机号)

手机号固定 11 位,直接:

=RIGHT(A2, 11)

或者更通用(如果号码长度不固定):

=MID(A2, FIND("@", SUBSTITUTE(A2,"-","@",2))+1, 99)

这个写法有点绕,解释一下:

  1. `SUBSTITUTE(A2,"-","@",2)` —— 把第 2 个横线换成 `@`
  2. `FIND("@", ...)` —— 找到 `@`(也就是原第 2 个横线)的位置
  3. `MID(..., 位置+1, 99)` —— 从这个位置往后取 99 个字符(多取无害,超出部分自动忽略)
关键这是"取最后一个分隔符之后"的经典套路。本来需要 `FIND("-", A2, FIND("-",A2)+1)` 嵌套,用 SUBSTITUTE 更清晰。

中间那段(部门)

=MID(A2, FIND("-",A2)+1, FIND("@",SUBSTITUTE(A2,"-","@",2))-FIND("-",A2)-1)

长得吓人,但拆开就是:从第一个横线后一位开始,取到第二个横线前一位。

更好的办法:分列

如果这种拆分经常做,别写公式,用「数据 → 分列」。

选中列 → 数据 → 分列 → 分隔符号 → 勾"其他"填 `-` → 完成。

一步拆成三列。比公式快十倍,而且不会有公式维护问题。

关键唯一的缺点是它不动态——源数据变了要重做。所以要"一次性的活"用分列,"持续更新的表"用公式。

365 专属:一个函数搞定(TEXTSPLIT)

如果你用的是 Microsoft 365 或 Excel 2021:

=TEXTSPLIT(A2, "-")

直接按 `-` 拆成一排,自动溢出到右边三个格子。

要按行拆就加第三个参数:

=TEXTSPLIT(A2, "-", , TRUE)

这一条能省掉上面那一堆嵌套。 但同样,版本不兼容——发给用 2016 的同事会显示 `#NAME?`。

清洗脏数据:四个必会的

1. 去空格:TRIM

=TRIM(A2)

去掉首尾空格,中间的连续空格压成一个。

易错注意:TRIM 只能去掉普通空格(ASCII 32)。从网页复制来的空格可能是"不间断空格"(`CHAR(160)`),TRIM 去不掉。要用:
=TRIM(SUBSTITUTE(A2, CHAR(160), " "))

2. 统一大小写

=UPPER(A2) → 全大写
=LOWER(A2) → 全小写
=PROPER(A2) → 每个单词首字母大写

3. 替换

=SUBSTITUTE(A2, "旧", "新")

比如把所有"元"去掉:

=SUBSTITUTE(A2, "元", "")

换成真正的数字:

=--SUBSTITUTE(A2, "元", "")

4. 文本转数字

=VALUE(A2)
=--A2

两个都行,`--` 更短。

实战:清洗一列手机号

原始数据可能长这样:

138 1234 5678
138-1234-5678
+8613812345678

统一成 11 位纯数字:

=RIGHT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(TRIM(A2)," ",""),"-",""),"+86",""), 11)

拆解:

  1. `TRIM` 去首尾空格
  2. 连着三次 `SUBSTITUTE` 去掉空格、横线、`+86`
  3. `RIGHT(..., 11)` 取最后 11 位
关键最后一步用 `RIGHT` 而不是直接返回,是为了兜住"+86"这种前缀。取后 11 位一定是对的。

判断包含:FIND 和 SEARCH 的区别

=ISNUMBER(FIND("技术", A2))

返回 TRUE 表示包含"技术"。

FIND 和 SEARCH 的区别只有一个:大小写。

  • `FIND("a", "ABC")` → `#VALUE!`(区分大小写,找不到)
  • `SEARCH("a", "ABC")` → 1(不区分)
关键中文没有大小写问题,两者结果一样。但处理英文、邮箱、型号时要留意。

常犯错误

现象原因解决
`#VALUE!`FIND 找不到字符套 IFERROR
切出来的字少了忘了 `-1`减掉分隔符本身
中文切出乱码用了 LENB/LEFTB改用 LEN/LEFT
数字变文本结果带引号用 `--` 转换
空格去不掉是不间断空格`SUBSTITUTE(...,CHAR(160)," ")`
关键关于 LENB / LEFTB:这些是"按字节"的旧函数,只在极老的双字节系统里有意义。现在的 Excel 中文版里,一个汉字算一个字符,用 LEN / LEFT 就对了,别用带 B 的。

一句话总结

LEFT/RIGHT/MID 是按个数切,FIND 是找位置,SUBSTITUTE 是替换。定长用切刀,不定长用 FIND 找位置,一次性的活用分列。
关键文本函数的价值不在单个,在组合。真正的活往往是"去空格 → 替换 → 截取 → 转换"四步连起来,写成一条长公式。写的时候别一次写完,一段一段试。

评论 0

还没有评论,来说第一句吧。

发表评论

提交后需审核通过才会显示。

对作品感兴趣?

欢迎交流使用体验、功能建议或技术问题,看到消息我会尽快回复。