导入客户名单前,先以微盟·智营销当前页面的字段模板为准改表头,再清洗空值、重复号码与格式,最后用五十条试导验证落位,是返工最少的顺序。表头对不上时不要先删列、改名就全量导入,那样通常只会拿到“字段错位、丢列或整批失败”的结果,而看不出是哪一行、哪一列出的问题。
处理方向:以导入页面当天的字段模板作为唯一标准,先做一份“原表头→目标字段→是否需要转换”的对照表,再处理空值、重复号码和格式不统一,然后挑五十条试导并逐列抽样核对。适用场景是人工整理的客户名单导入;边界在于字段名称、必填项和枚举范围会随页面配置变化,必须以当时页面显示为准,一次试导也只说明这一批数据能不能用。
在产品页面找到导入入口并查看当前的字段模板
先进入产品后台找到客户名单导入入口,把页面上的字段说明或可下载的模板文件当作唯一依据,不要沿用上一版表格的习惯。需要逐项记下三件事:字段名称、是否必填、格式要求。格式要求里常见的坑是手机号是否允许带空格、破折号或国家码,日期是按 YYYY-MM-DD 还是带斜杠,客户来源、客户等级这类枚举字段的可选值范围有哪些。
建议把模板里每一列抄成一份清单,或直接截图保存,作为后面改表头的比对基准。如果页面提供了模板文件下载,最省事的做法是保留模板表头,把自己表格的数据整列贴进去,而不是反过来改模板。
把现有表格的表头逐列对照模板
把现有表格的表头与模板清单并排对齐,先找同义不同名的列,例如“客户姓名 / 姓名 / 客户名称”“手机号码 / 联系电话 / 手机”,再找模板里有而表格里没有的列。对照结果建议落成下面这张表,避免靠记忆改列名。
| 原表头 | 对应目标字段 | 是否需要转换 | 无法对应时的处理 |
|---|---|---|---|
| 客户姓名 | 模板中的客户名称 | 否 | — |
| 联系电话 | 模板中的手机号 | 是,去空格与分隔符 | 含分机的固话先拆出人工确认 |
| 成交日期 | 模板中的注册日期 | 是,统一为 YYYY-MM-DD | 语义不符时不要硬套,单独列表 |
| 备注 | 模板中无此列 | 否 | 导入前删除,避免多余列触发校验 |
模板中的必填列如果原表缺失,只能人工补齐或拆成多批处理,不要用空字符串占位蒙混过去;非必填列缺失可以先留空,但要确认留空不会影响后续按该字段筛选。
用表格公式或一段通用脚本做清洗
清洗目标是三件:去首尾空格、统一手机号写法、统一日期格式,然后再去重。在表格里可以直接用公式,例如对 A 列去空格用 =TRIM(A2),对手机号去分隔符用 =SUBSTITUTE(SUBSTITUTE(B2,"-","")," ",""),日期栏先用 =ISNUMBER(C2) 判断是不是真日期,再决定是否用 =TEXT(C2,"yyyy-mm-dd")。下面的脚本只是通用骨架,字段名请以产品页面模板为准,本方案不假定产品提供开放接口。
# 通用清洗骨架,字段名需替换为模板中的实际名称
import csv, re, datetime
def norm_phone(v):
if not v:
return ''
return re.sub(r'[\s\-()()+]', '', str(v).strip())
def norm_date(v):
v = (v or '').strip()
for fmt in ('%Y-%m-%d', '%Y/%m/%d', '%Y.%m.%d', '%Y年%m月%d日'):
try:
return datetime.datetime.strptime(v, fmt).strftime('%Y-%m-%d')
except ValueError:
continue
return '' # 解析不了就留空,交给人工确认,不要猜
seen = set()
out = []
with open('raw.csv', encoding='utf-8-sig', newline='') as f:
for r in csv.DictReader(f):
phone = norm_phone(r.get('联系电话'))
if not phone or phone in seen: # 空号码与重复号码整行丢弃,另存待查
continue
seen.add(phone)
out.append({
'客户名称': (r.get('客户姓名') or '').strip(),
'手机号': phone,
'注册日期': norm_date(r.get('成交日期')),
})
with open('clean.csv', 'w', encoding='utf-8-sig', newline='') as f:
w = csv.DictWriter(f, fieldnames=['客户名称', '手机号', '注册日期'])
w.writeheader()
w.writerows(out)
去重口径建议提前定好:通常按手机号去重,保留首次出现的一行,把被丢弃的行另存一份待查,便于回看是数据重复还是两个真实客户共用了号码。
先导入五十条做抽样核对
正式导入前,从清洗结果里截取五十条做一次试导,目的不是看成功率,而是看字段有没有错列。导入完成后核对三件事:一是页面显示的导入成功条数与提交条数是否一致;二是从这五十条里随机抽十条,逐字段比对客户名称、手机号、日期在后台的落位是否正确,尤其注意姓名是否落进了手机号字段这类错位;三是把失败行连同失败原因记下来。
记录表可以很简单,三列就够用:行号或手机号、失败原因(页面提示的原文)、处理动作(改格式 / 去重 / 补字段 / 放弃)。这份记录同时是下一批导入的修改依据,避免同一批数据反复提交、反复失败。
按失败原因决定清洗数据还是拆批导入
把失败原因归成三类分别处理,比整批重来更快。
- 格式错误:手机号带分隔符、日期不是模板要求的写法、枚举值不在可选范围内。动作是回到清洗步骤统一格式,枚举值不匹配的改成模板允许的取值;验证方式是重新导出清洗结果,抽查这几列是否已统一。
- 重复记录:同一手机号在多行出现,或与系统中已有客户冲突。动作是按手机号去重并保留一份被丢弃行的清单;如果页面提示是已有客户,需要确认是更新还是跳过,不要盲目再导一遍。
- 字段缺失:必填列为空,或整列没有对应上。动作是补齐必填列,补不齐的行拆出去单独处理;如果缺失集中在某一列,也可以按有该列和无该列拆成两批导入。
做完一类修改就重跑一次小批量试导,确认这一类不再报错,再放大到全量。整批失败时先别急着重传,通常问题就藏在这三类原因里,按记录表逐条比对即可定位。