让 AI 写脚本替我干脏活:日志与 Excel 数据处理的实战避坑套路
同事:这堆日志你看一晚上?你:我三行脚本的事。
前言
做桌面软件项目的这些年,我有一大半时间不是在写 C++,而是在跟数据较劲:构建日志、自动化测试报告、版本对比清单、客户反馈表。我们这类需要长时间稳定运行的工具类软件,最怕跑着跑着夜里崩了,第二天早上面对的是几十兆甚至上百兆的日志。早年我用编辑器硬啃,一晚上看不完两千行;后来改成让 AI 写脚本、我来验脚本,机器干活人睡觉。这套打法用了几年,坑踩过不少,这篇全部拆开讲,代码都能直接跑。
适用边界先说清楚:这套方法适合格式相对固定的重复性数据处理。如果你的日志格式天天变、或者数据本身质量极差,收益会打折。
一、核心原则:让 AI 生成脚本,而不是让 AI 直接读数据
这是全篇最重要的一条,其他都是它的推论。
很多人用 AI 处理数据的第一反应是把文件内容贴进对话框,问「帮我统计一下错误分布」。这条路走不通,原因很实际:
- 上下文装不下。几十兆的日志折合成 token 轻松破百万,主流模型根本塞不进去;就算塞进去,模型对长上下文中间部分的把握也很差,容易漏看、看串。
- 结果不可复现。同样的数据问两次,答案可能不一样。做统计要的是确定性,不是「大概是这样」。
- 不可审计。模型给你一个数字,你无法知道它是怎么算出来的,错了也不知道错在哪。
- 数据出域有洁癖问题。把原始数据贴进对话框,等于把数据交给了别人的服务器。哪怕不涉及敏感内容,养成这个习惯本身就有风险。
正确的姿势是反过来的:数据永远留在本地,AI 只负责产出代码。脚本是确定的、可检查的、可复用的,跑一百次结果一样,这次写完下次还能用。AI 在这里的角色是「高级代码生成器」,不是「数据分析师」。
二、日志清洗流水线:从裸文本到结构化统计
拿到一份日志,别急着写解析代码,先走三步:抽样、定字段、再让 AI 生成脚本。
抽样这步的目的是让 AI(也让你自己)看清日志到底有几种格式。取头部、尾部和随机中段,避免只看到某一段的固定模式:
# 抽三类样本:头部、尾部、随机中段LOG=app.logtotal=$(wc-l<"$LOG")head-n50"$LOG">sample_head.txttail-n50"$LOG">sample_tail.txt# 按行数比例随机抽约 50 行,覆盖中段少见的格式awk-vn="$total"'BEGIN{srand()} rand() < 50/n'"$LOG">sample_random.txtcatsample_head.txt sample_random.txt sample_tail.txt>sample_for_prompt.txt把sample_for_prompt.txt贴给 AI,要求输出「解析 + 统计」一体的脚本。我用的典型版本长这样:
importargparseimportreimportpandasaspdfrompathlibimportPath LINE=re.compile(r"^\[(?P<ts>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3})\]"r"\s*\[(?P<level>DEBUG|INFO|WARN|ERROR|FATAL)\]"r"\s*\[(?P<module>\w+)\]\s*(?P<msg>.*)$")defparse_log(path:Path):rows,unmatched=[],[]withpath.open("r",encoding="utf-8",errors="replace")asf:fori,lineinenumerate(f,1):line=line.rstrip("\n")ifnotline.strip():continuem=LINE.match(line)ifm:rows.append(m.groupdict