删除部分字符串 KDB

Remove part of string KDB

我有一个名为 "t" 的 table,列为 "x"。它看起来如下:

x
------
1.Fred
2.Joe
3.Hank
.
.
.
500.Mary

我需要删除该列并删除名称前的所有内容,例如“1”。在弗雷德之前。

我试过了 更新 _'string x from t 但这只适用于数字 1-9,一旦我得到更大的数字就不行了。有没有办法删除“。”以及之前的一切?

假设 x 是符号类型的列:

q)update `$last each "."vs'string x from t
x
----
Fred
Joe
Hank
Mary

这结合了功能 vs 和副词 each-both: http://code.kx.com/q/ref/casting/#vs http://code.kx.com/q/ref/adverbs/#each-both

您可以为此使用 0: - 它通常是字符串列表的最佳方法,与使用查找和删除或 vs:[=16 相比,它对于更长的列表尤其有效=]

q)update raze(" *";".")0:string c from t
x
----
Fred
Joe
Hank
Mary

这有效地拆分了 "." 上的字符串,丢弃了 return 的第一列(通过未在 " *" 中指定,左侧 arg 的第一个元素到 0:),然后给出一个入伍的 return,需要将其夷为平地 return 到一个字符串列表,该列表将适合该列。

还有一种方法可以帮助覆盖名称中包含“.”的情况:

update x:`${(1+x ?\:".")_'x} string x from  t

逻辑是

  1. 将符号列 x 转换为字符串
  2. 获取字符串列表每个元素中第一个点的索引1+x ?\:"."
  3. 剪切第一个点之前的字符(1+x ?\:".")_'x

下一个模型可用于测试:

//Create table with 100 random names
t: ([] ID: til 100; x: `$(string 1+til 100),'".",'(?[;"abc"] each 1+100?9),'" ",'(?[;"def"] each 1+100?9));
//Replace space with dot for the last 10 names
t: update x: `$ssr[;" ";"."]'[string x] from t where ID>90;
update x:`${(1+x ?\:".")_'x} string x from  t

尽管使用@Ryan McCarron 提出的 0: 显然更快。如果您确定没有额外的点,则该方法更可取。

完成它的另一种方法是:

q)select (` vs/:x)[;1] from t
x
----
Fred
Joe
Hank

使用 inter 和 .Q 命名空间获得此结果的另一种方法

 t:update {`$x inter .Q.a,.Q.A} each string x from t
    
    x
    ----
    Fred
    Joe
    Hang

https://code.kx.com/q/ref/dotq/#qa-upper-case-alphabet
https://code.kx.com/q/ref/inter/