通过KDB中的子字符串重命名表列?

时间:2019-06-10 02:04:44

标签: kdb

如何在KDB中使用其子字符串重命名列?

示例:

初始表

    name  | number
------------------
  foo/bar |  999
  foo/log |  999
  foo/ton |  999
  foo/tin |  999

在使用name字符的情况下,查询应通过特定的定界符截断/列。

结果表1

    name  | number
------------------
    foo   |  999
    foo   |  999
    foo   |  999
    foo   |  999

或删除字符串之间的子字符串,即/字符。

结果表2

    name  | number
------------------
   foobar |  999
   foolog |  999
   footon |  999
   footin |  999

2 个答案:

答案 0 :(得分:5)

有很多方法可以解决此问题。

t:([name:("foo/bar";"foo/log";"foo/ton";"foo/tin")]number:999 999 999 999)

您可以vs,它允许您在分隔符上分割字符串。例如。下面将返回组成原始字符串的两个组成字符串的嵌套列表。

q)"/" vs "foo/bar"
"foo"
"bar"

然后您可以从此处在更新的列中选择要使用的字符串。

q)last "/" vs "foo/bar"
"bar"

或者可以使用raze将输出合并为一个字符串。

q)raze "/" vs "foo/bar"
"foobar"

然后可以在表的更新语句中使用这些方法。在这种情况下,我将each-right与sv运算符配合使用,以便对name列中的每个字符串进行操作。您还可以使用一个函数来对每个字符串进行调用。 (例如update name:{last "/" vs x}each name from t

q)update raze each  "/" vs/: name from t
name    | number
--------| ------
"foobar"| 999
"foolog"| 999
"footon"| 999
"footin"| 999
q)update last each  "/" vs/: name from t
name | number
-----| ------
"bar"| 999
"log"| 999
"ton"| 999
"tin"| 999
q)update first each  "/" vs/: name from t
name | number
-----| ------
"foo"| 999
"foo"| 999
"foo"| 999
"foo"| 999

对于第一个结果表,如果文件路径的长度始终相同,则可以在每个字符串上使用take运算符,这是一种更简单的方法,如下所示。

q)update 3#'name from t
name | number
-----| ------
"foo"| 999
"foo"| 999
"foo"| 999
"foo"| 999

答案 1 :(得分:1)

对于只想删除子字符串的情况,另一种选择是使用ssr,它将用目标字符串/字符替换所有出现的子字符串。

q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000)
name           | number
---------------| ------
"foo/bar"      | 999   
"foo/bar/thing"| 1000 
q) update ssr[;"/";""]@'name from t

输出:

name         | number
-------------| ------
"foobar"     | 999   
"foobarthing"| 1000