kdb中字符串拆分后按条件转换为Long类型异常问题求助
解决q语言函数返回类型不匹配的问题
嘿,我发现你的问题核心是误用了q的if语句——q里的if是单分支结构,只能接受「条件」和「一个执行表达式」,根本不支持if[cond; expr1; expr2]这种双分支写法。这种错误语法会让你的类型转换逻辑没有正确执行,最终返回的其实是原始字符串(不是long类型),这就是为啥809 ~ Func["AAA-809-AXSDF"]会返回0b的原因!
修正方案
方案1:用三元运算符$实现双分支判断
q里实现双分支逻辑的正确方式是用三元运算符$[condition; trueExpr; falseExpr],替换掉错误的if写法就行:
Func:{[x] Temp: vs "-" x; $["AAA" ~ Temp[0]; "J"$Temp[1]; "J"$Temp[2]] }
验证一下效果:
q)Func["AAA-809-AXSDF"] 809j // 末尾的j说明这是long类型 q)type Func["AAA-809-AXSDF"] 7h // 7h对应q中的long类型,转换成功 q)809 ~ Func["AAA-809-AXSDF"] 1b // 现在比较返回true,符合预期
方案2:用单分支if拆分逻辑
如果你坚持想用if,可以拆成两个单分支的if语句,逻辑上先判断满足条件时返回第一个转换结果,否则返回第二个:
Func:{[x] Temp: vs "-" x; if["AAA" ~ Temp[0]; : "J"$Temp[1]]; : "J"$Temp[2] }
为什么之前的写法会出问题?
错误的if[cond; expr1; expr2]写法会让q解析出错,实际执行时可能跳过了"J"$的类型转换步骤,直接返回了Temp[1]的原始字符串(看起来是数字,但本质是字符串类型)。字符串和long类型的数字比较自然会返回0b啦!
内容的提问来源于stack exchange,提问作者Code Enthusiast
相关产品推荐
相关产品推荐

