文本处理:LEFT/RIGHT/MID、TEXT、& 与 SUBSTITUTE 清洗
系统导出的数据很少有干净的:姓名部门连在一起、手机号中间几位要打码、日期格式五花八门、编号前后带空格。文本函数就是数据清洗的主力工具。这一篇按「截取、定位、替换、拼装」四类动作来讲,每类都给出可复制的公式。
截取类:LEFT / RIGHT / MID
三个函数分别从左、从右、从中间截取字符(LEFT、RIGHT 各接一个长度,MID 接起始位置和长度):
=LEFT("张三-销售部",2) ' 得「张三」
=RIGHT("13812345678",4) ' 得「5678」
=MID("20260915",5,2) ' 得「09」
LEFT 和 RIGHT 各要一个长度参数,MID 多一个起始位置。参数顺序记法:MID(文本,从哪开始,取多长)——中文里念出来就是「从哪开始取多长」,自然得不用背。
配合 FIND 定位动态分隔符,拆分才够通用。比如「部门-姓名」格式要取姓名:
=RIGHT(A2,LEN(A2)-FIND("-",A2))
LEN 取总长度,FIND 找「-」的位置,两者相减就是「-」后面的字符数。分隔符不确定在第几位时,这个组合比硬写 MID 的位置稳。
定位类:FIND / SEARCH / LEN
FIND(查找文本, 源文本, [开始位置]):区分大小写。SEARCH(查找文本, 源文本, [开始位置]):不区分大小写,支持通配符。
日常清洗用 SEARCH 更宽容。典型组合:判断手机号位数并打码——
=LEFT(A2,3)&"****"&RIGHT(A2,4)
先无条件信任长度是 11 位;不信任就先 LEN 判断(不等于 11 的单独标出人工核对)。想系统学习「按模式匹配文本」的方法论,可以看 正则表达式从入门到精通,Excel 的 FIND+MID 组合本质上就是正则的「手工版」,理解正则后很多清洗可以一条规则走天下。
替换类:SUBSTITUTE / TRIM / CLEAN
SUBSTITUTE(text, old_text, new_text, [instance_num]):替换。把带括号后缀的部门名统一:
=SUBSTITUTE(A2,"(华东)","")
全角括号也要一起替换时,写两个 SUBSTITUTE 嵌套。还可以指定只替换第几次出现(第四参数)。
- TRIM(text):去掉首尾空格,并把中间多个连续空格压成一个。系统导出的「张三 」靠它救。
- CLEAN(text):删除不可打印的控制字符(从网页复制的数据常带)。
| 函数 | 清理对象 | 典型来源 |
|---|---|---|
| TRIM | 首尾与多余空格 | 系统导出、手工录入 |
| CLEAN | 不可打印控制字符 | 网页复制、 XML 导出 |
| SUBSTITUTE | 指定字符串 | 口径不统一的部门名、旧编码 |
实战中最常见的清洗流水线是「先 TRIM 再替换最后比较」:
=TRIM(SUBSTITUTE(A2,CHAR(160)," "))
CHAR(160) 是不间断空格,肉眼看不见但 VLOOKUP 匹配不上它,从网页复制的数据十有八九带。
格式转换:TEXT 与 TEXTSPLIT 边界
TEXT(value, format_text) 把数值按格式代码转成文本。常用格式代码与效果对照:
| 格式代码 | 结果示例 | 用途 |
|---|---|---|
$#,##0.00 |
$1,234.57 | 两位小数金额 |
YYYY/MM/DD |
2026/10/22 | 标准日期 |
yyyy年m月d日 |
2026年10月22日 | 中文日期 |
aaaa |
星期四 | 中文星期 |
0.0% |
28.5% | 一位小数百分比 |
套用方式统一为把单元格套进 TEXT。以当天日期为例,结果就是 2026/10/22 这样的标准格式。
关键认知:TEXT 的结果是文本,不能再当数字计算。官方建议保留原始值,另起单元格做 TEXT,后续公式引用原始值。中文格式代码(年月日、aaaa 星期)依赖系统区域和语言包,显示异常时先确认 Excel 语言设置,以你的版本为准。
文本拆列还有一条捷径:Excel 2013 起的「快速填充」(Ctrl+E),按示例自动识别规律,快捷键一篇有详细用法。它方便但不可控、不可复制,正式模板还是函数稳。
一步到位的 TEXTSPLIT:Microsoft 365 和 Excel 2022 起提供 TEXTSPLIT 函数,一条公式按分隔符把文本拆成多列(甚至拆行):
=TEXTSPLIT(A2,"-")
「张三-销售部」直接拆成两列,连拖公式都省了。低版本没有这个函数,老老实实用 LEFT/FIND 组合或「数据→分列」。分列是顿号、逗号、空格等固定分隔符的首选,函数适合分隔符位置不固定的复杂场景。
拼装类:& 与 CONCAT/TEXTJOIN
最经典的是 & 运算符,连接文本与单元格:
="尊敬的"&A2&":"&CHAR(10)&"您本月迟到"&B2&"次,请注意考勤。"
CHAR(10) 是换行符(需开启自动换行才显示),拼通知类文本时几乎必用。Excel 2016 起新增 CONCAT(替代 CONCATENATE,支持区域)和 Excel 2019/365 的 TEXTJOIN(用分隔符批量连接,可跳过空值):
=TEXTJOIN("、",TRUE,B2:D2)
把三项并列内容用顿号连接,TRUE 表示忽略空单元格。发通知、做名单拼接时极好用,几百人的名单一条公式就拼完。版本提醒:TEXTJOIN 需 Excel 2019 或 Microsoft 365,2016 没有,低版本只能靠 & 逐个连——做模板发给旧版同事前先确认这点。
实战:从打卡记录提取时间
假设 A 列是「2026-09-01 08:52:31」格式的文本,要拆出日期和小时:
日期:=DATEVALUE(LEFT(A2,10))
小时:=VALUE(MID(A2,12,2))
DATEVALUE 把日期文本转成真正的日期序列值,VALUE 把数字文本转成数值。拆完这两列才能被透视表和条件统计正常处理——这就是第一章说的「容器」的颗粒度。
再进一步,如果导出的日期是「2026/9/1 上午 08:52」这种带中文的混合格式,套路一样:先找分隔符位置,再截取转换。复杂格式批量处理推荐用「数据→分列」配合函数,分列负责粗拆,函数负责精修。
清洗流水线的标准节奏
不管导出格式多花哨,清洗顺序固定四步,别跳着来:
| 步骤 | 动作 | 用的函数 |
|---|---|---|
| 一 | 备份原列,复制出清洗列 | 无 |
| 二 | 清不可见字符 | CLEAN、CHAR(160) 替换 |
| 三 | 修空格和全角符号 | TRIM、SUBSTITUTE |
| 四 | 类型转换 | VALUE、DATEVALUE |
先清再看,而不是边看边改——顺序乱了,后面的步骤会覆盖前面的成果,半天找不到哪里被动过。每一步只做一件事,做完检查一遍再进下一步。
新手常见误区
- 在源数据上直接替换。清洗至少留一份原始导出,改坏了能回滚。养成「先复制一列,再动刀」的习惯。
- FIND 找不到时报错没兜底。先判有没有分隔符,比一片 #VALUE! 专业:
=IFERROR(FIND("-",A2),0)
- 以为 SUBSTITUTE 区分大小写是谣言。它确实区分,替换英文关键字时注意大小写变体。
- TEXT 的结果又喂回 SUM。文本进 SUM 得 0,还找不到原因,记住「TEXT 只用于展示」。
- 全角半角符号不分。全角括号「()」和半角「()」是两个字符,SUBSTITUTE 只换你写的那一个。清洗前先把符号统一,否则同一条规则要写两遍。
清洗是脏活,但它是所有分析的地基。把常用清洗公式按场景存成自己的「公式库」,配合笔记工具归档,你的效率会随复用次数指数上升——第一次写半小时,第二次复制改区域,第三次起就是十秒钟的事。
本章由 WorkBuddy 原创整理,函数行为以 Microsoft Excel 官方文档为准。
