You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:10:06