先停掉正在跑的那条输入流程,把新旧格式各找一条真实样本放在一起对照,再决定是改校验规则、加转换层,还是要求上游改回原格式。直接改提交脚本而不改校验规则,通常会让后续所有依赖同一份输入的报表悄悄错位,这是格式变化时最容易踩的坑。
同一个词在不同角色嘴里含义不同。运营说“格式变了”,可能指字段顺序调整;数据同事说“格式变了”,可能指字符编码从 GBK 换成 UTF-8;开发说“格式变了”,可能指分隔符从逗号变成制表符。这三种变化对应的处理方式完全不同,先别急着动手改,把分歧落到具体样本上。
假设你手里有一个用于批量提交推广素材的文本文件,旧版是逗号分隔、字段固定七列;新版换成制表符分隔、多了一列来源标记。此时可以做的第一个动作是:把新旧两条样本并排放在一个纯文本文件里,逐列标出差异。结果会直接告诉你变化属于“列数增减”“分隔符替换”还是“编码差异”,下一步该改的是解析逻辑而不是字段映射。
输入规范不要写成一段描述,拆成四段后每个角色都能核对自己关心的部分:
四段里最容易被忽略的是异常约定。格式变化时,上游往往只改了结构,却没说明不合法行怎么处理。如果你不在规范里写清楚,工具会按自己的默认行为处理,而不同工具的默认行为并不一致,这正是多角色对同一事实理解不同的根源。
两条路都成立,但适用条件不同。
选择一:改校验规则,让工具接受新格式。 适用条件是格式变化是长期方向、上游不会再退回旧格式,且下游消费方也能同步接受新结构。动作是更新校验脚本里的列数、分隔符和必填项判断,然后拿新旧样本各跑一遍。如果旧样本在新规则下报错,说明你其实需要的是兼容而不是替换。
选择二:加一层格式转换,把新格式还原成旧格式再进入原有流程。 适用条件是格式变化只是上游临时调整、下游流程短期内不动,或者多个下游共用同一份旧格式输入。动作是写一个转换步骤,放在校验之前。结果如何影响下一步:如果转换后旧流程能正常产出,说明问题被隔离在入口;如果转换后仍有行失败,说明变化不止在结构层,需要回到第一段重新比对样本。
判断依据可以看一个信号:新格式是否改变了字段的语义。如果只是分隔符和列顺序变了,转换层足够;如果某一列的含义被重新定义,比如“来源”从渠道名变成了渠道编号,那么转换层必须同时做值映射,否则校验通过但结果错误。
假设团队约定输入文件每行七列,第五列是投放日期,格式为 YYYY-MM-DD。上游某次更新后,第五列变成 YYYY/MM/DD,其余不变。运营认为“只是斜杠换横杠”,开发认为“日期解析会失败”,两边说的都对,但停在分歧上没有意义。
把它转成可核对的项目:取新格式的一行,写进校验脚本能读到的测试文件,运行一次。如果脚本报日期不合法,就确认变化影响了解析;如果脚本通过但后续统计里该日期为空,说明解析器静默失败了。两种结果指向不同的修复位置——前者改解析规则,后者改异常处理。这个例子里所有数字和格式都是假设,用于说明比较方法,不代表任何真实工具的行为。
输入规范一旦改动,最省事的做法是在文件头部或配套说明里写清楚三件事:生效日期、改动前后的差异、以及遇到旧格式时的处理方式。这样下一个拿到这份输入的人不需要重新猜。动作本身很小,但它决定了格式再变一次时,团队是重新排查还是直接对照记录。
如果上游无法稳定提供格式说明,退一步的做法是把每次收到的样本存一份,按日期归档。当出现“以前能跑现在不能跑”的争议时,用两份样本对比比争论谁记得更准更有效。归档不解决格式变化本身,但能让变化被定位到具体一次提交,而不是变成各角色之间无法验证的印象分歧。