InfoSphere 11.7空值处理疑问:固定长度文本文件是否存在空值?
InfoSphere 11.7 ETL中固定长度文件的
IsNull判断逻辑疑问 我正在迁移一个用InfoSphere 11.7编写的旧ETL流程,原流程以UTF-8编码的固定长度.txt文件为输入,文件内容示例如下:
300000007200_0000000000004 20230524123704000000 P4 0001000073873269002000005091662 0001000073875269002 8 1 700202909 2160000000005967 20230524041311000000 P1 000100005606358000700000236541000045097 2502000501851 0001000066063680007 1000 000000237540000000 1 30000008810000000000003279 20230524041319000000 P2 00010000681349580050000366684071497 6204131926 00000100006813496800464000000000000000036768100000 1
原流程里使用IsNull函数判断行中特定位置的子串是否为空,示例代码如下:
If IsNull(Substrings(Input.reg,1,1)) then " " else Substrings(Input.reg,1,1)
我熟悉pandas、SQL中的空值概念,但不清楚InfoSphere这个场景下的空值定义。我原本认为固定长度文件的每个位置都有字符(包括空格),不会存在空值,请问这个判断是否正确?
解答
你的判断并不完全正确,在InfoSphere DataStage(InfoSphere ETL的核心组件)中,IsNull的行为和你熟悉的pandas/SQL空值逻辑有区别,针对固定长度文件场景,以下几种情况会触发IsNull返回True:
- 字段定义与实际内容不匹配:如果原ETL里对
Input.reg这类字段的定义长度,大于文件实际该行对应位置的字符数,读取到行尾后超出的部分会被识别为NULL,而非空格。 - 存在ASCII控制字符:如果文件对应位置是
NUL(ASCII码0)这类不可见控制字符,DataStage会把它解析成NULL,而非普通空格。 - 类型转换失败:如果原流程给这个子串设置了特定数据类型(比如数值型),当子串是全空格这类无法转成目标类型的内容时,DataStage会标记为
NULL,此时IsNull就会返回True。 - 自定义规则映射:有些旧DataStage流程会通过配置或自定义转换,把连续空格(或符合特定规则的空白)转成
NULL,这种情况也会触发判断。
针对你贴的示例代码,Substrings(Input.reg,1,1)返回NULL的话,大概率是上面某一种情况,不是文件没有对应位置的字符。迁移时可以这么排查:
- 查看原DataStage流程中
Input.reg的字段定义(长度、数据类型); - 用十六进制编辑器检查源文件对应位置有没有
NUL这类特殊字符; - 运行原流程的测试用例,观察这个判断实际什么时候触发,确认空白内容的处理规则。
内容的提问来源于stack exchange,提问作者imatiasmb
相关产品推荐
相关产品推荐

