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

在KDB中通过表列的子字符串重命名表列?,kdb,Kdb,如何在KDB中使用子字符串重命名列 例如: 初始表格 name | number ------------------ foo/bar | 999 foo/log | 999 foo/ton | 999 foo/tin | 999 对于/字符,查询应将名称列截断一定的分隔符 q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000) 结果表1 name | number ------------

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

例如:

初始表格

    name  | number
------------------
  foo/bar |  999
  foo/log |  999
  foo/ton |  999
  foo/tin |  999
对于
/
字符,查询应将
名称
列截断一定的分隔符

q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000)
结果表1

    name  | number
------------------
    foo   |  999
    foo   |  999
    foo   |  999
    foo   |  999
或者删除字符串之间的子字符串,即
/
字符

q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000)
结果表2

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

有很多方法可以做到这一点

t:([name:("foo/bar";"foo/log";"foo/ton";"foo/tin")]number:999 999 999 999)
您可以选择允许在分隔符上拆分字符串的选项。下面返回组成原始字符串的两个组成字符串的嵌套列表

q)"/" vs "foo/bar"
"foo"
"bar"
然后,您可以从这里选择要在更新列中使用的字符串

q)last "/" vs "foo/bar"
"bar"
或者可以使用raze将输出合并为一个字符串

q)raze "/" vs "foo/bar"
"foobar"
然后可以在表的update语句中使用这些方法。在本例中,我使用sv运算符,以便对name列中的每个字符串进行操作。您还可以使用一个函数来调用每个字符串。(例如,
更新名称:{last”/“vs x}t中的每个名称

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

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

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

q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000)
输出:

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

谢谢你的回复。这些解决方案很有效。那么,我该如何用两个分隔符分割字符串呢?i、 “foo/bar/thing”->“bar/thing”或“bar”没问题。由于vs的结果是一个嵌套列表,如果我有>2个输出,我将使用简单的索引来获取我想要的元素。例如,
(“/”vs“foo/bar/thing”)[1]
给出“bar”。为了得到“bar/thing”(除了去掉带有4_的“foo”之外),我会在我想要组合的元素上使用sv<代码>“/”sv(“/”vs“foo/bar/thing”)[12]。在这种情况下,sv基本上与vs相反。
name         | number
-------------| ------
"foobar"     | 999   
"foobarthing"| 1000