朋友的公司上个月做数据交接,客服系统导出了三个月的工单记录,三万两千多行,分成三个文件。交接方说“数据都在里面了”,接手的人打开一看,中文是问号,行号挤成一团,还有几万行是空行。最后是我用 Notepad++ 花了一个下午收拾干净的。整个过程没有什么高深技巧,但顺序错了就会返工,这里完整复盘一遍。
事故现场:同一批数据,三种换行
先把问题摊开看。三个文件的毛病并不一样:
- 文件 A 从 Windows 客户端导出,CRLF 换行,UTF-8 带 BOM,直接能读
- 文件 B 来自 Linux 服务器,LF 换行,纯 UTF-8,但在 Windows 里打开后整段挤成一行
- 文件 C 是同事用旧版表格软件另存出来的 CSV,GBK 编码,引号里的逗号没转义,字段一列错位全列错位
如果一上来就合并、就去重,后面全是无用功。所以第一步不是动手,是看清楚。在 Notepad++ 里点开“视图—显示符号—显示所有字符”,行尾是 CRLF 还是 LF、有没有制表符、有没有全角空格,一眼就能看出来。这一步能省掉后面一大半的猜测。
第一步:先备份,再谈修改
凡是要做批量替换,先复制一份原件,这是规矩。更稳妥的做法是提前打开 Notepad++ 的备份功能:在“设置—首选项—备份”里勾选会话快照和定期备份,万一改错了,还能从备份目录里捞回来。
另外提醒一句,Notepad++ 默认不自动保存,标签页上的星号就是未保存标记。处理大文件时养成按 Ctrl+S 的习惯,比事后后悔强。
第二步:统一编码,别让中文变问号
文件 C 打开是乱码,不要急着转码。正确顺序是先用“编码—字符集—中文—GBK”把它按原编码读出来,确认中文正常显示,再执行“编码—转为 UTF-8 无 BOM”另存。反过来操作,先转 UTF-8 再改字符集,中文就彻底回不来了。
文件 A 带 BOM,导入数据库时常见的“首列字段名多了三个乱码字符”就是它造成的,同样转成 UTF-8 无 BOM。文件 B 的换行符问题,用“编辑—档案格式转换—转换为 Windows 格式”一次解决,全选后转换也行,注意转换前先保存。
第三步:用正则把半结构化文本拆成列
这批日志的格式大体是“时间 | 工单号 | 客户 | 内容”,但分隔符时而竖线、时而制表符、时而多个空格。手工对齐不现实,靠的是查找替换里的正则模式。
常用到的几条:
- 把连续空白压成一个制表符:查找
[ \t]+,替换为\t,勾选正则表达式 - 删掉行首行尾的多余空格:查找
^\s+|\s+$,替换留空 - 把日期格式从 2024/03/05 统一成 2024-03-05:查找
(\d{4})/(\d{2})/(\d{2}),替换为\1-\2-\3
替换之前一定先点“查找全部”,在结果窗口里数一数命中多少处。数字对不上,说明表达式写宽了或者写窄了,先改表达式,别急着点“全部替换”。
第四步:列编辑和书签处理零散脏数据
正则解决不了的,是那种“大部分行规整、少数行错位”的情况。这时候按 Alt 加鼠标拖动,进入列编辑模式,可以只在某一列区间里插入或删除字符,不会影响其他字段。给几百行补同一个前缀,这个方法比替换安全得多。
还有一种场景是只想看异常行。用“搜索—标记”,把包含“超时”或“失败”的行标上颜色,再通过“搜索—书签—复制书签行”把结果单独提取到新文档。原文件不动,异常清单先出来,排查效率高很多。
第五步:重复动作交给宏
三个文件要执行同一套清理步骤,一条条点太慢。Notepad++ 的宏功能可以录制:点“宏—开始录制”,把前面几步操作走一遍,停止录制后保存,再对另外两个文件“运行宏”。注意录制期间不要用鼠标乱点菜单以外的地方,多余动作也会被记进去。
最后合并文件时,把三个文档依次“编辑—全选—复制”,粘贴进一个新建文档即可。合并前后各存一版,方便对比。想确认两次修改到底差在哪,装一个 Compare 插件,两个文件并排着色显示差异,比自己瞪着眼睛找靠谱。
这个案例留下的四条经验
- 先看符号再动手,换行符和编码是八成乱象的根源
- 任何批量替换前先“查找全部”核对数量,再执行替换
- 原件永远保留一份,改错能回退比改得快更重要
- 重复三步以上的操作就录宏,别高估自己的耐心
说到底,Notepad++ 在这类活儿里的价值不是功能多,而是每一步都看得见:字符看得见、替换结果看得见、差异也看得见。数据整理最怕的不是麻烦,是不知道自己在改什么。把顺序理清楚,三万行也只是几个下午的事。