在kdb+q中从字符串列提取数值生成新列的技术求助
提取字符串中对应数值的KDB解决方案
先看你的原表:
t:([] price:100 200; Text:("Selling price 100 and purchase price 200 threshold 250";"Selling price 200 and purchase price 300"))
下面提供两种高效的向量化方法,直接批量处理整表数据:
方法一:字符串拆分提取
利用KDB的字符串拆分操作,直接批量提取目标数值:
// 提取Selling price对应的数值 sellingPrice: "J"$each first each " " vs each 1 _ "Selling price " vs each t[`Text] // 提取purchase price对应的数值 purchasePrice: "J"$each first each " " vs each 1 _ "purchase price " vs each t[`Text] // 将新列加入原表 t: t, `sellingPrice`purchasePrice! (sellingPrice; purchasePrice)
执行后表t会新增sellingPrice和purchasePrice列,结果如下:
price Text sellingPrice purchasePrice ----- --------------------------------------------------------------------- ------------ ------------- 100 "Selling price 100 and purchase price 200 threshold 250" 100 200 200 "Selling price 200 and purchase price 300" 200 300
代码解释:
"Selling price " vs each t[Text]`:将每个Text字符串按"Selling price "拆分,得到包含空字符串和后续内容的列表1 _ ...:移除拆分后的空字符串,保留包含目标数值的部分" " vs each ...:将剩余字符串按空格拆分,第一个元素就是目标数值的字符串形式"J"$each ...:将字符串转换为整数类型(若需要浮点数可改用"F"$)
方法二:正则表达式提取
如果字符串格式可能有变化,正则表达式更灵活,需要先加载KDB的正则模块:
\l re.q // 加载正则处理模块 // 匹配Selling price后的数字 sellingPrice: "J"$each re[;"Selling price (\d+)"] each t[`Text] // 匹配purchase price后的数字 purchasePrice: "J"$each re[;"purchase price (\d+)"] each t[`Text] // 合并新列到原表 t: t, `sellingPrice`purchasePrice! (sellingPrice; purchasePrice)
这种方法通过正则(\d+)精准匹配数字部分,兼容性更强,适合字符串格式有小幅变动的场景。
对比你原来的方法
你尝试的索引定位方法需要逐个处理字符串,代码繁琐且效率低,上面的向量化操作是KDB的最优实践,能高效处理整表数据,避免循环遍历的性能损耗。
内容的提问来源于stack exchange,提问作者VUM
相关产品推荐
相关产品推荐

