在客户入库、订单质检与跨系统对接中,业务表经常混入位数不对的手机号、金额为负的冲红行,以及姓名等必填项为空的脏记录。质检既不能只留下「看起来干净」的行,也不能把问题行悄悄删掉。

如果采用传统手工方式,分析师往往先筛一遍合格样本另存,再反向筛一遍异常样本,两次操作口径容易不一致;复盘时还缺少一列可追溯的「异常原因」,下游只能凭经验猜这一行为什么被拦下。

DT-Bot 的 「数据校验」 算子专为解决此类按「怎样算不合格」把一张表拆成合格表与异常表的问题而设计。源表只读、一行不丢;异常表会多一列「异常原因」。多条规则默认「任一命中即异常」,两张新表行数加起来等于源表行数。

一、 核心能力与适用场景

「数据校验」算子聚焦于双路分流 + 异常原因留痕,覆盖以下四大核心能力:

核心能力 解决什么业务问题 典型业务场景
长度不合格 按字段长度判定不合格,例如不是 N 位。空串长度按 0。 入库前拦脏:手机号不是 11 位的进异常,其余进合格。
比较不合格 按数值或文本比较判定不合格,例如金额小于 0。 对账:金额小于 0 的进异常,非负金额进合格。
必填为空 空白和空单元格都算空,空则进异常。 姓名为空的进异常,已填姓名的进合格。
多条规则(默认或者) 多条不合格规则并列,默认任一命中即异常;可分别指定两路表名。 手机号不是 11 位,或者金额小于 0,进异常,其余进合格。

二、 边界指南:它与相近算子有何区别?

在构建数据工作流时,理解算子之间的职责边界至关重要:

比较维度 「数据校验」算子 「筛选器」算子 「表格拆分」算子 「行操作」算子 「数据脱敏」算子
主要定位 按不合格规则拆合格表 + 异常表 只抽出符合条件的行,只要一张表 按门店 / 渠道等拆成很多张 改单元格、去空格 遮盖手机号等敏感值
输出机制 源表只读,写出两张新表;异常表带「异常原因」 源表只读,写出一张新表 源表只读,写出多张新表 就地更新单元格 就地或另存,改写单元格显示
典型动作 长度、比较、必填、多规则或者分流 比较、包含、为空、提取重复行 按列值、日期、行数拆堆 字符清洗、替换 掩码、截断、哈希
如何选择 “合格和异常都要留档,异常还要写原因” “只要大额订单一张表做专项” “按门店拆成很多张分表” “把姓名前后空格清掉” “手机号不能明文给下游”

三、 提示词编写规范与公式

「数据校验」算子支持自然语言直接表达,建议遵循以下标准的三要素编写公式:

【目标表】 + 【不合格规则】 + 【两路结果名(可选)】

1. 目标表表达

  • 单表精准点名:明确校验哪一张表,例如 校验 “客户登记” :...;
  • 默认当前流转表:若提示词中未显式提及表名,算子将默认继承上一节点连线流入的数据表。

2. 不合格规则表达

  • 长度:手机号不是 11 位的进异常;
  • 比较:金额小于 0 的进异常;
  • 必填:姓名为空的进异常(空白和空单元格都算空);
  • 多条规则:默认「或者」——任一命中即进异常,例如 手机号不是 11 位,或者金额小于 0。

3. 结果名(可选)

  • 不写结果名:合格表、异常表分别为「源表名_合格」「源表名_异常」;
  • 两路都点名:例如 合格输出 “客户合格”,异常输出 “客户异常”;
  • 只点一个结果名、又没有说合格 / 异常两路:会当成筛选器,本节点应拒绝。

示例:

校验 “客户登记” :手机号不是 11 位的进异常,其余进合格。

对应三段:

  1. 表:客户登记
  2. 不合格:手机号长度不是 11
  3. 结果:默认 客户登记_合格、客户登记_异常

四、 核心功能与图解实战

以下结合真实企业数据场景,展示「数据校验」在不同需求下的处理效果:

场景 1:长度不合格(手机号不是 11 位)

业务背景:客户入库前要拦位数不对的手机号。11 位的进合格底稿;不是 11 位(含空串,长度按 0)的进异常表,并写明原因,源登记表不得改写。

【处理前:客户登记】

客户编码 姓名 手机号
C01 华为 13812345678
C02 阿里 1380000
C03 腾讯 (空)

【执行提示词】

校验 “客户登记” :手机号不是 11 位的进异常,其余进合格。

【处理后:客户登记_合格】

客户编码 姓名 手机号 分流说明
C01 华为 13812345678 长度 11,进入合格

【处理后:客户登记_异常】

客户编码 姓名 手机号 异常原因
C02 阿里 1380000 手机号不是 11 位
C03 腾讯 (空) 手机号不是 11 位(空串长度按 0)

逻辑详解:合格侧只有 C01;异常侧为 C02、C03,并带「异常原因」。源表「客户登记」仍是 3 行。本条未点名的字段(如姓名是否为空)不参与判定。


场景 2:比较不合格(金额小于 0)

业务背景:订单质检要把冲红负金额拦进异常,零元与正数进入合格,供后续对账。

【处理前:订单质检】

订单号 金额
O1 100
O2 -8
O3 50

【执行提示词】

校验 “订单质检” :金额小于 0 的进异常。

【处理后:订单质检_合格】

订单号 金额 分流说明
O1 100 100 不小于 0,进入合格
O3 50 50 不小于 0,进入合格

【处理后:订单质检_异常】

订单号 金额 异常原因
O2 -8 金额小于 0

逻辑详解:合格:O1、O3。异常:O2。边界值 0 不算「小于 0」。源表只读;两路行数之和等于源表行数。


场景 3:必填为空(姓名不得空)

业务背景:客户登记要求姓名必填。空白和空单元格都算空,空则进异常,已填姓名的进合格。

【处理前:客户登记】

客户编码 姓名 手机号
C01 华为 13812345678
C02 阿里 1380000
C03 (空) 13811112222

【执行提示词】

校验 “客户登记” :姓名为空的进异常。

【处理后:客户登记_合格】

客户编码 姓名 手机号 分流说明
C01 华为 13812345678 姓名已填,进入合格
C02 阿里 1380000 姓名已填,进入合格

【处理后:客户登记_异常】

客户编码 姓名 手机号 异常原因
C03 (空) 13811112222 姓名为空

逻辑详解:空白和空单元格都算空。本条只校验姓名,不因手机号位数把 C02 打进异常。源表只读。


场景 4:多条规则(默认或者,自定义两路表名)

业务背景:入库要同时拦「手机号不是 11 位」和「金额小于 0」。任一命中即异常;两路表名要写成业务可识别的「客户合格 / 客户异常」。

【处理前:客户登记】

客户编码 姓名 手机号 金额
C01 华为 13812345678 100
C02 阿里 1380000 50
C03 腾讯 (空) -8

【执行提示词】

校验 “客户登记” :手机号不是 11 位,或者金额小于 0,进异常,其余进合格。合格输出 “客户合格”,异常输出 “客户异常”。

【处理后:客户合格】

客户编码 姓名 手机号 金额 分流说明
C01 华为 13812345678 100 两条规则均未命中

【处理后:客户异常】

客户编码 姓名 手机号 金额 异常原因
C02 阿里 1380000 50 手机号不是 11 位
C03 腾讯 (空) -8 手机号不是 11 位;金额小于 0

逻辑详解:任一规则命中即进异常。两张新表行数加起来等于源表行数(1 + 2 = 3)。源表「客户登记」不被改写。

五、 常见问题与操作贴士(FAQ)

Q1:为什么执行后会多出两张表,而源表一行都没少?

答:本算子默认源表只读、一行不丢。命中不合格规则的行走异常表,其余走合格表;异常表会多一列「异常原因」。不写结果名时,两路分别为「源表名_合格」「源表名_异常」。若您只要一张筛出结果、不要异常归档,请使用「筛选器」。

Q2:只写了一个结果名,没有说合格 / 异常两路,会怎样?

答:本节点应拒绝。只点一个结果名、又没有说合格 / 异常两路,语义上会当成「筛选器」。请同时写清两路,或明确「进异常,其余进合格」。

Q3:多条规则是「并且」还是「或者」?空串长度怎么算?

答:多条规则默认「或者」——任一命中即异常。空串长度按 0,因此「手机号不是 11 位」会把空手机号打进异常。空白和空单元格在必填规则里都算空。

Q4:数据校验会改单元格或遮盖手机号吗?

答:不会。本节点只决定每一行走合格还是异常,并在异常表写「异常原因」。去空格、改单元格请用「行操作」;遮盖手机号请用「数据脱敏」。按门店拆成很多张请用「表格拆分」。

六、 关联算子导航