KDB获得子串

时间:2017-10-04 10:41:38

标签: 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

EDIT。子字符串应始终包含第一个len(符号)-2字符,因此在上面的示例中,aaa用于aaaAx,bb用于bbAx

4 个答案:

答案 0 :(得分: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

如果情况并非如此,请提供有关如何识别要提取的子字符串的更多详细信息

希望这有帮助

乔纳森

答案 1 :(得分: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 第3行是' ctr'原始符号字符的字符数。

答案 2 :(得分: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

答案 3 :(得分: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,则此操作会更快,因为不同的值可以在不进行计算的情况下使用。