KDB 获取子字符串
KDB get substring
如何添加一个包含另一个包含符号的列的子字符串的列。所以,从
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(symbol) -2 个字符,因此在我上面的示例中,aaa 代表 aaaAx,bb 代表 bbAx
如果你想提取的子串是一个固定长度的,你可以这样做:
q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1)
q)update ext:`#'string sym from t
date sym pos ext
------------------
d1 aaaA1 1 aaa
d1 bbbA1 2 bbb
d1 aaaA2 3 aaa
d2 aaaA3 1 aaa
如果不是这种情况,请提供更多有关如何识别要提取的子字符串的详细信息
希望对您有所帮助
乔纳森
下面可以有一个巧妙的应用方法,但这是我首先想到的。
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(symbol) - 2
第 3 行从原始符号字符中提取 'ctr' 个字符。
使用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
你没这么说,但这是 kdb+,所以我们假设:
- 你的table很长
- 您的
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,此操作会更快,因为不同的值无需计算即可使用。
如何添加一个包含另一个包含符号的列的子字符串的列。所以,从
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(symbol) -2 个字符,因此在我上面的示例中,aaa 代表 aaaAx,bb 代表 bbAx
如果你想提取的子串是一个固定长度的,你可以这样做:
q)t:flip `date`sym`pos!(`d1`d1`d1`d2;`aaaA1`bbbA1`aaaA2`aaaA3;1 2 3 1)
q)update ext:`#'string sym from t
date sym pos ext
------------------
d1 aaaA1 1 aaa
d1 bbbA1 2 bbb
d1 aaaA2 3 aaa
d2 aaaA3 1 aaa
如果不是这种情况,请提供更多有关如何识别要提取的子字符串的详细信息
希望对您有所帮助
乔纳森
下面可以有一个巧妙的应用方法,但这是我首先想到的。
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(symbol) - 2 第 3 行从原始符号字符中提取 'ctr' 个字符。
使用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
你没这么说,但这是 kdb+,所以我们假设:
- 你的table很长
- 您的
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,此操作会更快,因为不同的值无需计算即可使用。