如何将Perl脚本的unpack命令转换为Azure Synapse表达式?
Perl逻辑转Azure Synapse表达式修正
原Perl逻辑梳理
- 从
$rec(0索引)的280位置截取4字节/字符的子串赋值给$changeNum - 若子串不是纯数字,通过
unpack("i*")将其解析为32位有符号整数;若是纯数字则保留其数值含义
当前尝试表达式的问题
- 条件逻辑反转:原逻辑是「非纯数字时执行转换」,但当前表达式是「纯数字时转整数,否则返回0」,与需求不符
- 错误分支处理错误:原逻辑要求非纯数字时解析二进制为整数,而非返回0
正确的ADF表达式
分两种场景处理:
场景1:Column_1是字符串类型(存储ASCII字节)
iif( regexMatch(substring(Column_1, 281, 4), '^[0-9]+$'), toInteger(substring(Column_1, 281, 4)), toInteger(binary(substring(Column_1, 281, 4))) )
- 说明:
substring(Column_1,281,4):ADF字符串的substring是1索引,对应Perl 0索引的280位置regexMatch(...):判断子串是否为纯数字- 纯数字分支:直接转成整数
- 非纯数字分支:将子串转成二进制后,解析为32位有符号整数(模拟Perl
unpack("i*"))
场景2:Column_1是二进制类型
iif( regexMatch(toString(substring(Column_1, 280, 4), 'ASCII'), '^[0-9]+$'), toInteger(toString(substring(Column_1, 280, 4), 'ASCII')), toInteger(substring(Column_1, 280, 4)) )
- 说明:
- 二进制类型的
substring是0索引,直接用280对应原Perl的位置 - 先将截取的二进制转成ASCII字符串,判断是否为纯数字
- 非纯数字分支直接将二进制子串转成整数,符合
unpack("i*")的解析逻辑
- 二进制类型的
内容的提问来源于stack exchange,提问作者user15382501
相关产品推荐
相关产品推荐

