结论是有条件的:只有当旧输入规范里存在“格式假设”时,才需要改规范;如果格式变化只是同一语义的另一种写法,先别动规范,改用一层适配更稳。判断依据不是格式新旧,而是解析失败发生在哪一步、失败是否可复现、以及旧规范里有没有把格式写死。缺少完整数据或权限时,最小动作是拿一个已知正确样本和一个失败样本做对照,只改能解释差异的那一条规则,并记录改动的适用边界;这只能说明该规则在这组样本上成立,不能推出全量数据、其他格式或未来版本也成立。
对象格式变化通常分三类,处理方式完全不同。
只有前两类需要改输入规范;第三类改规范没用,必须先改字段映射和校验规则。一个可操作的区分办法:把新格式样本和旧格式样本都转成同一中间结构,如果转换后字段能一一对应,属于表示法或结构变化;如果对应不上或对应后含义冲突,属于语义变化。
输入规范一般包含两层:解析层负责把原始对象读成字段,约束层负责规定字段的类型、必填、取值范围和唯一性。格式变化时,优先改解析层,约束层尽量不动。原因是约束层承载的是业务判断,频繁跟着格式走会让规范失去稳定性。
具体动作:在解析层增加一个适配步骤,把新格式转换成旧规范期望的中间结构;如果转换后旧约束全部通过,说明只需保留适配层,不必改约束。如果转换后仍有字段缺失或类型冲突,再针对那一条约束做最小修改,并在规范里注明“此约束依赖新格式的某个字段”。这样做的结果是:后续再出现同类格式变化时,只需新增适配,不必反复改约束,回归测试的范围也可控。
没有全量样本、没有生产环境读取权限时,仍然可以做三件事:
这里能推出的结论仅限于:这条规则能解释当前这组样本的差异。不能推出的是:该规则覆盖所有同类对象、其他字段没有类似问题、或上游不会再改格式。要得到更强结论,需要更多样本或可重复的抽样,而不是靠一次对照。
假设某次导出把字段分隔符从逗号改成了制表符,而某个字段本身可能包含逗号。旧规范按逗号切分,于是该字段被切成两列,后续列全部错位。此时改法有两种:
两种选择成立的条件不同:前者要求分隔符与内容字符不冲突,后者要求解析器支持转义。若无法确认上游是否保证这一点,保守做法是保留旧解析路径,新增一条按制表符解析的路径,并让两条路径输出同一中间结构,再对比结果是否一致。这只说明两条路径在当前样本上一致,不代表所有边界情况都一致。
一个明确的反例:格式变化同时伴随编码变化。比如分隔符和字段都没变,但文件从 UTF-8 变成带 BOM 的 UTF-8,或从 UTF-8 变成 GBK。此时按“只改解析层”的思路调整分隔符规则不会解决问题,因为失败发生在解码阶段,表现为首字段带不可见字符或中文乱码。识别方法是看失败样本的原始字节开头是否有 BOM 标记,以及乱码是否集中在非 ASCII 字符。若确认是编码问题,应先固定解码方式,再判断是否需要改解析规则。把编码问题误判为分隔符问题,会导致规则越改越多,而根因仍在。
另一类失效情形是权限不足导致无法验证。如果只能看到解析后的结果、看不到原始对象,那么任何关于格式的判断都只是推测。此时应把结论标记为待验证,而不是直接改规范。
建议按以下顺序推进:先固定一个可复现的失败样本;再确认失败发生在解码、解析还是约束哪一层;然后只改对应那一层,并保留旧路径作为对照;最后在规范里写明本次改动适用的格式条件、不适用的情况和验证样本来源。记录时避免写“已适配新格式”这类笼统结论,改为写“当分隔符为制表符且字段内不含制表符时,按制表符切分并通过原约束”。这样下次格式再变时,能快速判断是新增适配还是修改约束,而不是从头排查。