对象格式变化后,输入规范不能整套推翻重写,而应先判断变化属于哪一种:只是字段位置或分隔方式变了,还是查询对象本身换了类型。前者改映射和清洗规则即可,后者必须改输入结构,否则工具只会把新对象当成脏数据过滤掉,表面看是“没结果”,实际是输入层已经错位。下面按这两种条件分别说明选择依据、实施动作和例外。
典型信号是:同一批对象以前能进,现在报格式错误、字段错位或部分行被跳过,但对象本身还是原来的类型。这时问题在解析层,不在对象定义层。
选择依据可以看三点:字段数量是否一致、能否找到稳定的分隔符、变化后的字段能否与旧字段一一对应。如果三点都成立,就属于这一类。
实施动作分两步。第一步,把新旧格式各取少量样本并排比对,列出字段对应表,例如旧格式第2列是地域、新格式第4列才是地域。第二步,在输入规范里只改映射和清洗规则,不动查询对象的定义。可以用一段伪代码记录这种映射,避免口头约定:
读取每行 → 按新分隔符切分 → 按字段表取地域/词根/修饰词 → 丢弃空字段 → 进入原查询对象
这样做的结果通常是:原本被跳过的行重新进入处理队列。下一步要观察的是,进入后是否出现大量语义重复或明显不相关的组合——如果有,说明映射虽然通了,但字段语义判断错了,需要回到对应表修正,而不是继续加过滤条件。
如果变化后的对象不再是原来的词或词根,而是整句、带标点的自然语言、多语言混排,或者从单值变成了多值组合,那么它已经不是“格式变化”,而是对象类型变化。此时只改分隔符没有意义。
判断依据是:旧规范里所有清洗规则都建立在“短词、无标点、单一语义单元”这个假设上。新对象一旦打破这个假设,继续沿用旧规则会把有效内容切碎或整段丢弃。
实施动作是先定义新的输入单元,再决定是否保留旧规则作为前置步骤。具体来说:确认新对象的最小可处理单位是什么,是否需要保留原始整句,是否允许一句话拆成多个查询单元。如果允许拆分,要明确拆分依据是标点、空格还是语义边界,并把这条依据写进输入规范,而不是留给执行人临场判断。
假设一个场景:原来输入的是“地域+词根”,现在输入的是带描述的长句。若直接按空格切分,长句会被切成大量无意义片段,后续组合结果几乎不可用。若保留整句作为一个单元,则查询范围会明显收窄。两种做法都成立,区别在于目标是覆盖更多组合还是保持语义完整。这个例子只用于说明选择方法,不代表任何具体工具的实际表现。
很多人在改输入规范时只改“怎么读”,忘了改“读到什么算合格”。格式变化往往伴随数据来源变化,而来源变化会带来新的空值、重复值和编码问题。
建议在输入规范里补一条合格线,明确哪些情况直接丢弃、哪些情况保留但标记。例如:字段缺失超过一定数量就丢弃,同一对象重复出现只保留一条。这条合格线要和后面的处理逻辑对齐,否则会出现“输入通过了,但输出全是重复项”的情况。
另一个容易漏掉的是编码和大小写。对象格式变化后,如果来源系统不同,同一内容可能以不同编码或不同大小写出现。是否需要统一,取决于后续是否按字面比对。如果不统一,重复判断就会失效。
验证的目标不是“看起来正常”,而是能区分两种失败:输入层失败和处理层失败。
需要注意的是,通过率或结果数量下降,不能单独证明规范改对了,也不能单独证明改错了。它还可能来自数据源本身变化、查询范围调整或去重规则收紧。要结合样本比对来判断,而不是只看一个数字。
如果对象类型已经变化,而工具本身只支持固定类型的输入,那么继续调整规范只是在做无效适配。这时应该先确认工具对输入对象的支持范围,再决定是换处理方式,还是把新对象转换成工具能接受的类型。涉及具体工具的支持范围和当前能力时,需要以该工具的实际说明为准,不能凭旧教程推断。
还有一种例外:格式变化只是临时的、一次性的导入。这种情况下,与其改长期输入规范,不如单独做一次转换,避免为一次性数据污染常规流程。判断标准是这种格式会不会再次出现;会,就改规范;不会,就做一次性处理。
把这两类条件分清之后,改输入规范就不再是反复试错,而是一个有依据的取舍:同类型变化改映射,类型变化改结构,支持范围不匹配就停止适配。