2017-10-04 134 views
1

如何添加包含另一个包含符号列的子字符串的列。所以,去从KDB获取子字符串

t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 

date sym pos 
d1 aaaA1 1 
d1 bbA1  2 
d1 aaaA2 3 
d2 aaaA3 1 

t:flip `date`sym`pos`ext!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1;`aaa`bbb`aaa`aaa) 

date sym pos ext 
d1  aaaA1 1 aaa 
d1  bbA1 2 bb 
d1  aaaA2 3 aaa 
d2  aaaA3 1 aaa 

编辑。子字符串应该总是包含第一个len(符号)-2个字符,所以在我上面的示例中,aaa代表aaaAx和bb代表bbAx

回答

1

如果您希望提取的子字符串长度不变,那么可以这样做以下:

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 
q)update ext:`$3#'string sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA3 1 aaa 

如果不是的话,请提供与问候一些详细介绍如何提取的子字符串可以识别

希望这有助于

乔纳森

+0

感谢您的回答。我提供了更多关于编辑子字符串的细节 – chrise

+1

在这种情况下,您可以使用 'update ext:\'$ -2_'string sym from t' –

1

可以有一个聪明的方式来应用下面,但这是我第一次想到。

t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1) 
t: update ctr: {-2 + count string x} each sym from t; 
t:{[x] :update ext:x[`ctr]#string(x[`sym]) from x} each t; 

第二线被施加您的逻辑:LEN(符号) - 2- 第三线正在字符的“​​点击率”号码从原始符号字符。

+0

啊,甜蜜......我到了第二行,基于Jonathon's回答,但我无法让它在更新中工作。不知道'每个t'。谢谢 – chrise

+0

如果你正在运行这个非常大的数据集(〜数亿行),性能可能是一个问题,因为上面的代码将每行传递给函数。在这种情况下,你可能想优化代码..其他情况下,我认为它应该没问题。 – jeonw

0

使用drop

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbA1`aaaA2`aaaA3;1 2 3 1) 
q)update ext:`$-2_'string sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbA1 2 bb 
d1 aaaA2 3 aaa 
d2 aaaA3 1 aaa 
0

你没有这么说,但这是KDB +,所以我们假设:

  • 你的表是长
  • sym列有重复

您不需要将所有符号转换为字符串,并且回来:只有不同的。 (在这个例子中,我已经改变了创建重复的标志之一。)

q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA1;1 2 3 1) 
q)update ext:{nub:distinct x;(`$-2 _'string nub)nub?x}sym from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA1 1 aaa 

utility .Q.fu适用的功能,独特的项目。

q)update ext:.Q.fu[{`$-2 _'string x};sym] from t 
date sym pos ext 
------------------ 
d1 aaaA1 1 aaa 
d1 bbbA1 2 bbb 
d1 aaaA2 3 aaa 
d2 aaaA1 1 aaa 

此操作会更快,如果sym柱已经存储为enumeration,因为不同的值随后将被提供无需计算。