结论先说:对象格式变化后,不要只改字段名或分隔符,而要先把“输入规范”拆成三层——对象边界、字段语义、失败处理。三层里任何一层仍沿用旧格式的隐含假设,工具都会表现为“能导入但不生效”或“部分成功”。下面按一个矛盾现象、两种解释、区分证据的顺序说明怎么改。
常见情形是:对象从一种结构换成另一种结构后,工具仍提示导入完成,但后续分析结果明显偏少。此时最容易做的动作是反复调整分隔符或编码,结果往往时好时坏。更可能的原因是输入规范只对“行”负责,没有对“对象边界”负责。
假设一个短例子:旧对象是每行一条记录,新对象是一条记录跨多行、用空行分隔。若输入规范仍按“一行一条”解析,工具会把同一条记录的后半段当成新记录,字段数对不上时静默丢弃。这里的数字只用于说明比较方法:旧格式每行 6 个字段,新格式每条记录 6 个字段但占 3 行,按行解析就会得到约三分之一的可用记录。这不是工具坏了,而是规范的解析单位没跟着变。
解释一:字段语义变了。新格式中原本叫“地址”的字段被拆成“省/市/详细地址”,或原本的“状态”从文本变成编码。此时导入通常不会整体失败,而是某些字段为空或值错位。特征是:记录总数接近预期,但个别列缺失或类型不符。
解释二:对象边界变了。记录的分隔方式、嵌套层级或数组结构改变,导致解析单位与规范不一致。特征是:记录总数明显少于预期,且缺失集中在特定位置,或首条正常、后续错位。
两种解释都会表现为“结果不对”,但改动方向相反:前者要改字段映射和类型声明,后者要改记录分隔、嵌套展开和去重规则。先判断属于哪一种,能避免把边界问题当成字段问题反复试错。
取新旧格式各一小段,分别用当前输入规范跑一次,记录四个量:输入对象数、工具识别出的记录数、字段完整率、被跳过的行或节点数。若记录数与输入对象数一致、仅字段完整率低,偏向解释一;若记录数低于输入对象数且跳过量集中,偏向解释二。
需要注意,记录数归零或跳过量偏高,不能单独证明规范一定错了。它也可能是源文件本身截断、编码不一致、必填字段为空,或工具对某类字符的处理方式不同。要区分这些原因,可以固定其他条件,只替换一个变量:先只换分隔方式,再只换字段顺序,观察哪一个变量改变时记录数才变化。
按以下顺序改,每一步都留下可比较的结果:
完成边界声明后,若记录数恢复正常但字段仍错位,下一步就应转向字段映射,而不是继续调整分隔符;若记录数仍偏低,则应检查嵌套层级展开规则和去重条件,而不是逐列核对。这个动作顺序的价值在于:它把“格式变化”拆成可分别验证的两类原因,避免在同一轮里同时改动多个变量。
输入规范应随对象格式版本一起记录,并注明它适用的结构特征,例如记录分隔方式、字段层级和必填项。若对象格式再次变化,先比对新旧结构差异,再决定是扩展规范还是新建一套,不要在原规范上直接覆盖。对具体工具能否识别某种嵌套或某类编码,需要以该工具当前说明和实际小样本结果为准,不同工具的支持范围并不一致。
当输入规范与对象边界、字段语义、失败处理三层对齐后,格式变化带来的问题就从“结果不对但说不清哪里不对”,变成可定位、可回归的具体差异。后续再遇到同类变化,也能按同一顺序判断先改哪一层。