如何在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)
您可以通过多种方法进行此操作。
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)