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

Car*_*ein 0 kdb

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

例:

初始表

    name  | number
------------------
  foo/bar |  999
  foo/log |  999
  foo/ton |  999
  foo/tin |  999
Run Code Online (Sandbox Code Playgroud)

name如果是/字符,查询应通过某个定界符截断该列。

结果表1

    name  | number
------------------
    foo   |  999
    foo   |  999
    foo   |  999
    foo   |  999
Run Code Online (Sandbox Code Playgroud)

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

结果表2

    name  | number
------------------
   foobar |  999
   foolog |  999
   footon |  999
   footin |  999
Run Code Online (Sandbox Code Playgroud)

Mic*_*and 5

您可以通过多种方法进行此操作。

t:([name:("foo/bar";"foo/log";"foo/ton";"foo/tin")]number:999 999 999 999)
Run Code Online (Sandbox Code Playgroud)

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

q)"/" vs "foo/bar"
"foo"
"bar"
Run Code Online (Sandbox Code Playgroud)

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

q)last "/" vs "foo/bar"
"bar"
Run Code Online (Sandbox Code Playgroud)

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

q)raze "/" vs "foo/bar"
"foobar"
Run Code Online (Sandbox Code Playgroud)

然后,您可以在表的更新语句中使用这些方法。在这种情况下,我将sv运算符与each-right一起使用,以便对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
Run Code Online (Sandbox Code Playgroud)

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

q)update 3#'name from t
name | number
-----| ------
"foo"| 999
"foo"| 999
"foo"| 999
"foo"| 999
Run Code Online (Sandbox Code Playgroud)