KDB/Q解析OrderID字符串及字段拼接操作咨询
KDB/Q OrderID解析与字段拼接实现方案
前置准备:构造样例测试表
先按照给出的字段和样例数据构造测试表,后续所有操作都基于该表执行:
// 构造业务测试表 trade:([] InstanceID:`NG1`NG2`NG1; OrderID:("jhbubuy-ClientName1-2022-07-01";"nb8yvce-ClientName2-2022-07-01";"cebciube-ClientName3-2022-07-01"); Strategy:`VWAP`POV`TWAP; Fills:5000 300 1000 )
需求1:拆分OrderID新增ClientName列
OrderID固定以-为分隔符,结构为随机流水号-客户名称-交易日期,拆分后取索引为1的片段(q语言索引从0开始计数)即为客户名称,实现代码如下:
// 逐行拆分OrderID提取客户名,默认存为symbol类型,需字符串格式可去掉开头的`$强转 trade:update ClientName:`$1@/:"-"vs/:OrderID from trade
执行后ClientName列对应值为ClientName1/ClientName2/ClientName3,和要求的格式完全匹配。
需求2:拼接生成InstanceID_OrderID列
按业务通用唯一键规则,拼接格式为InstanceID值_去掉随机流水号的OrderID内容,即拆分OrderID后跳过第一段随机流水,剩余片段用-拼回后,和InstanceID字段用_连接,实现代码如下:
// 逐行拼接生成新字段 trade:update InstanceID_OrderID:`$(string[InstanceID],\:"_",'/:"-"sv/:1_/:"-"vs/:OrderID) from trade
执行结果验证
执行完上述两段代码后查询全表,输出结果如下:
q)trade InstanceID OrderID Strategy Fills ClientName InstanceID_OrderID ---------------------------------------------------------------------------------------------------- NG1 "jhbubuy-ClientName1-2022-07-01" VWAP 5000 ClientName1 NG1_ClientName1-2022-07-01 NG2 "nb8yvce-ClientName2-2022-07-01" POV 300 ClientName2 NG2_ClientName2-2022-07-01 NG1 "cebciube-ClientName3-2022-07-01" TWAP 1000 ClientName3 NG1_ClientName3-2022-07-01
代码说明
vs/:为逐行按指定分隔符拆分字符串的副词用法,适配表的列操作场景1_/:为逐行跳过拆分后列表的第一个元素(即随机流水号片段)sv/:为逐行按指定分隔符拼接字符串列表- 若实际拼接规则有调整(比如不需要日期段、更换分隔符),直接修改对应索引截取范围和拼接符号即可
内容的提问来源于stack exchange,提问作者Lawrence
相关产品推荐
相关产品推荐

