删除部分字符串 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
逻辑是
- 将符号列
x
转换为字符串
- 获取字符串列表每个元素中第一个点的索引
1+x ?\:"."
- 剪切第一个点之前的字符
(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/
我有一个名为 "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
逻辑是
- 将符号列
x
转换为字符串 - 获取字符串列表每个元素中第一个点的索引
1+x ?\:"."
- 剪切第一个点之前的字符
(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/