如何在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
答案 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