你有没有试过:导出一版客户电话地址表,想按城市批量发短信,结果发现“北京”“北京市”“Beijing”全混在一起?或者想筛出所有带“朝阳”的客户,却漏掉了一堆写成“Chaoyang”“朝阳区”“朝阳路8号”的?别怀疑,不是你手抖,是数据在装睡。

为什么电话地址总在"打架"?根源在三个细节

我帮本地生活类客户搭过20多个数据系统,最常听到的一句话是:“这地址看着都对,怎么就是匹配不上?”
上周刚有个做社区团购的老板,从大众点评和小红书爬了3万条门店信息——电话字段里同时存在“021-62345678”“+862162345678”“6234-5678”,地址字段里“浦东新区张江路123号”和“上海张江路123号浦东”并存。他用Excel手动改了两天,第三天发现新来的数据又打回原形。

问题不在工具,也不在人懒。就卡在三个具体动作没做死:

  1. 分隔符不统一 —— 横杠、空格、括号、顿号,全凭用户心情
  2. 国码/区号没约定 —— 有人写“+86”,有人写“0086”,更多人直接省略
  3. 地址层级没锚定 —— “海淀区中关村大街1号”和“北京海淀区中关村大街1号”,少一个字,机器就当陌生人

这三个坑填平,80%的匹配失败会当场消失。

电话结构化:3个规则让手机和座机不再混淆

规则1:手机号必须保留10-11位纯数字

别管用户输的是“138-0013-8000”还是“(138)0013 8000”,目标只有一个:提取连续11位数字。
用Excel就能干:SUBSTITUTE(SUBSTITUTE(A1,"-","")," ",""),再套个LEN()检查长度。
重点提醒:如果原始数据里有“013800138000”这种带前导零的座机混入,先别急着删——得人工确认是不是真有0开头的固话,否则回拨时会直接忙音。

规则2:座机号统一格式为"区号-号码",分机单独成列

“010-8888-1234转5678”这种,必须拆成两列:

  • 电话主号 → 010-88881234(注意去掉中间横杠,但保留区号和号码间的横杠)
  • 分机号 → 5678(或“转5678”,看你们内部怎么用)
    之前有家同城配送公司,把“88881234”“01088881234”“010-8888-1234”全塞进同一字段,结果系统校验时把北京和杭州的号码全判成无效——统一格式后,客服外呼接通率明显提升。

规则3:国际号码保留国码,但去掉"+“和空格

“+86 138 0013 8000” → “8613800138000”
操作很简单:先用SUBSTITUTE(A1,"+","")干掉加号,再用SUBSTITUTE(A1," ","")清空格,最后检查是否以“86”“852”“853”等开头。
老系统吃不进“+”号,这是血泪教训。我们对接过的12个SaaS后台,有9个明确要求国码必须是纯数字开头。

地址结构化:用一个函数拆出省市区街道

地址不能当字符串硬匹配。你想查“朝阳区客户”,结果“北京市朝阳区”“朝阳区建国路8号”“朝阳CBD”全被漏掉——因为它们在数据库里根本不是同一类字符串。

真实做法是:强制拆成5列固定字段

  • 省(如:北京、江苏)
  • 市(如:北京、南京)
  • 区(如:朝阳、玄武)
  • 街道(如:建国路、中山路)
  • 详细地址(如:8号院2号楼、金鹰国际B座12层)

哪怕原始地址只写了“朝阳区”,也要补全成:
省=北京|市=北京|区=朝阳|街道=空|详细地址=空
这样后续用BI工具画热力图、导出区域名单、对接高德API,才能真正按“区”筛选。

怎么拆?如果你用飞书多维表格或腾讯文档,直接上「智能识别」功能——粘贴地址列,点一下“识别省市县”,80%能自动分好。剩下20%,建个简易词典表(比如“朝阳→朝阳区”“静安→静安区”),用XLOOKUP批量替换。

正则表达式:结构化数据的瑞士军刀,但别乱用

正则不是炫技,是解决重复劳动的螺丝刀。
我见过最典型的翻车现场:有人写了个超长正则,想一口气把“北京市朝阳区东大桥路8号院1号楼”拆成5段,结果把“8号院”误判成“8号”+“院”,后面全乱套。

建议你分两步走:
第一步,抓确定项
比如先用\d{11}揪出所有11位纯数字,标为“疑似手机号”;再用0\d{2,3}-\d{7,8}抓带区号的座机。这两类占了85%以上。

第二步,补模糊项
地址里的“一号”“二号”“1号”“No.1”,统一替换成“1号”。不用一次写完,打开Excel的查找替换,分三批处理:

  • 先换中文数字:一→1,二→2……十→10
  • 再换英文编号:No.→,NO.→,#→
  • 最后统一分隔:把“号”“楼”“单元”前面的空格全删掉

上个月帮一家房产中介清洗安居客数据,他们原始地址里“朝陽區”“海澱區”这类繁体写了快3000条。我们建了个简繁对照表,用XLOOKUP批量替换,再跑一遍地址识别,百度地图API调用成功率大幅增长。

用Python做自动化清洗,别再手动点鼠标

如果你每天要处理500+条新数据,Excel公式只是过渡方案。
下面这段代码,是我给本地服务商写的最小可用脚本——复制粘贴就能跑,不需要装任何额外库:

import re
import pandas as pd

def clean_phone(phone):
    if not isinstance(phone, str):
        return ""
    # 干掉所有非数字字符
    cleaned = re.sub(r'\D', '', phone)
    # 处理常见国码
    if cleaned.startswith('86') and len(cleaned) == 13:
        return cleaned
    elif len(cleaned) == 11:
        return cleaned
    else:
        return ""

def clean_address(address):
    if not isinstance(address, str):
        return address
    # 简单清理:去空格、统一逗号、繁体转简体(需提前准备字典)
    address = re.sub(r'\s+', '', address)
    address = re.sub(r'[,、;]', ',', address)
    return address

重点不是代码多酷,而是它能帮你把“今天下午三点前要导出朝阳区客户清单”这件事,从手动筛选1小时,变成双击运行30秒。

验收标准:3个检查点让你立刻发现问题

结构化做完别急着交差,用这三招快速验伤:

  1. 电话长度报警
    在Excel里加一列=LEN(B2),筛选出长度≠11(国内手机号)或≠13(含86国码)的行,标红。顺便看看有没有“暂无”“微信联系”“见备注”这种非号码内容——这些得人工归档,别让它污染主字段。

  2. 地址三级必填
    对“省”“市”“区”三列分别用=COUNTBLANK()统计空值。只要有一列空值率>5%,说明你的地址词典漏了关键地名(比如忘了加“雄安新区”“南沙区”),得立刻补。

  3. 手机号去重预警
    选中电话列 → 数据 → 删除重复项 → 勾选“仅针对此列”。如果删掉上百条,大概率是爬虫重复抓取,或是销售同事反复录入同一客户。这时候别删,先标黄,人工核对后再决定合并还是剔除。

这三个检查,10分钟内能揪出90%的数据陷阱。我们团队现在每清洗一批数据,第一件事就是跑这三遍。

今天就能执行的3个操作步骤

别收藏吃灰,现在就打开你手边正在用的表格(飞书多维表格 / 腾讯文档 / Excel),做这三件事:

  1. 立刻备份原始数据
    右键工作表标签 → 「移动或复制」→ 勾选「建立副本」→ 新表重命名为“原始_20240520”

  2. 用Ctrl+H统一电话格式
    打开查找替换(Ctrl+H)→ 查找内容填 - → 替换为留空 → 全部替换;
    再查 (空格)→ 替换为留空 → 全部替换;
    最后查 → 全部删掉。三步搞定基础清洗。

  3. 把地址列拆成“省-市-区”三列
    选中地址列 → 数据 → 分列 → 选择「分隔符号」→ 勾选「其他」填入 → 下一步 → 设置三列分别为“文本”→ 完成。
    如果地址里没逗号(比如“北京市朝阳区东大桥路8号”),就手动用FIND定位:
    =LEFT(A2,FIND("市",A2)+1) 提取省+市,再用MID继续剥——先试10条,手感来了自然快。

做完这三步,你会突然发现:原来不是数据太乱,是你一直没给它立规矩。