结论先说:对象格式变化时,不要只改文件后缀或字段名,而要先把输入规范拆成“对象边界、字段语义、校验规则”三层,再按工具当前解析能力逐层重写;如果工具只接受固定结构而你的对象已经变成混合结构,那么继续修补旧规范通常无效,应改为先做一层规范化转换。下面给出判断依据和可执行步骤。
很多输入失败看起来是格式问题,实际是语义漂移。比如原来一行一个页面,现在一行里同时包含页面、查询词和地区;如果只把分隔符从逗号改成制表符,工具仍会把它当成一个对象,结果要么全部丢弃,要么归到错误分组。可用一个简单检验:取三条新数据,人工标注每条应该对应几个对象、每个字段含义是什么,再和工具当前接受的输入规范对比。若对象数量或字段含义对不上,就属于语义变化,必须先拆行或拆列,而不是调分隔符。
第一层是对象边界:一行代表什么、一个批次最多多少行、空行和注释行如何处理。第二层是字段语义:每个位置是页面地址、查询词、目标地区还是分组标签,缺失值用空字段还是占位符。第三层是校验规则:哪些字段必填、允许的字符范围、重复行如何合并。重写时先固定第一层,因为对象边界一变,后面两层都要跟着变。若工具当前版本对混合对象支持有限,就把边界收缩为“一行一个页面”,把查询词和地区拆到独立列或独立批次,具体支持范围需要以工具实际说明为准。
假设原来输入规范是单列页面地址,现在数据源变成三列:页面地址、查询词、地区。若直接把三列粘进旧模板,工具可能把整行当成一个地址,导致所有行都无效。此时应先把规范改为三列,并明确第二、三列缺失时是否允许留空。然后取十条数据做小批量试跑,观察输出中对象数量是否与输入行数一致。若输出对象数少于输入行数,说明合并或去重规则被触发;若多于输入行数,说明某列被再次拆分。根据这个结果决定下一步是调整分隔符、增加转义,还是回到数据源先做规范化。
上面这套改法有一个反例:当工具本身只接受固定模板,而你无法修改模板或增加转换层时,重写输入规范只能让数据通过校验,却无法让工具理解新对象。例如工具只按固定列顺序读取,而你新增的列必须放在末尾,否则整批失败。这时继续在输入侧修补会反复出现“格式对了但结果不对”。更合理的动作是先在外部把新对象转换成工具能理解的旧结构,再导入;如果外部转换也不可行,就应更换处理路径,而不是继续调整输入规范。请求量或抓取量下降不能单独证明规范改对了,也可能是数据源本身变少、去重规则生效或批次被截断,需要结合输出对象数量一起看。
按以下顺序做,每步都留下可对比的结果:
这样做的结果是:你能区分“格式通过”和“语义正确”,并在工具不支持新对象时及时转向外部转换或更换路径,而不是在输入规范上反复试错。