1. 项目背景与核心挑战
去年接手一个遗留代码库迁移项目时,我面对的是一个包含9763个源文件的庞然大物。这些文件跨越12年历史,包含Java、Python、C++等多种语言,文件编码从GB2312到UTF-8不等,甚至有些注释是用俄语写的。直接把这些"脏数据"喂给AI做代码分析,就像把未分类的垃圾倒进精密仪器——不仅效果差,还可能损坏模型。
2. 预处理流水线设计
2.1 文件指纹系统
首先用SHA-256为每个文件生成唯一指纹,避免重复处理相同内容。这里没有用简单的MD5,因为项目中存在大量微小改动的副本文件(比如Config.java.bak, Config.java.old等),需要更精确的碰撞检测。
python复制import hashlib
def get_file_fingerprint(filepath):
with open(filepath, 'rb') as f:
return hashlib.sha256(f.read()).hexdigest()
2.2 编码统一作战
使用chardet库检测文件编码时,发现一个经典陷阱:某些GBK文件会被误判为ISO-8859-1。我的解决方案是双重验证:
- 先用chardet快速扫描
- 对置信度<90%的文件,用
cchardet进行二次检测 - 最终用
iconv批量转码为UTF-8
关键发现:Windows下的ANSI编码文件需要特殊处理,它们实际上是本地代码页编码(中文系统就是GBK)
2.3 代码"洗澡"流程
- 去噪阶段:
- 用正则表达式清除TODO/FIXME注释
- 移除连续空行(保留单空行维持可读性)
- 标准化行尾符为LF
python复制import re
def clean_code(content):
content = re.sub(r'//\s*(TODO|FIXME).*?\n', '\n', content)
content = re.sub(r'\n{3,}', '\n\n', content)
return content.replace('\r\n', '\n')
- 元数据剥离
