删除字符串KDB的一部分
我有一个名为“t”的表,列为“x”。情况如下:删除字符串KDB的一部分,kdb,q-lang,Kdb,Q Lang,我有一个名为“t”的表,列为“x”。情况如下: x ------ 1.Fred 2.Joe 3.Hank . . . 500.Mary 我需要取下该列并删除名称之前的所有内容,例如Fred之前的“1.” 我试过了 从t中更新$2_u'string x,但这只适用于数字1-9,而不适用于较大的数字。是否有办法删除“.”及其之前的所有内容?假设x是符号类型的列: q)update `$last each "."vs'string x from t x ---- Fred Joe Hank Mary
x
------
1.Fred
2.Joe
3.Hank
.
.
.
500.Mary
我需要取下该列并删除名称之前的所有内容,例如Fred之前的“1.”
我试过了
从t中更新
$2_u'string x
,但这只适用于数字1-9,而不适用于较大的数字。是否有办法删除“.”及其之前的所有内容?假设x是符号类型的列:
q)update `$last each "."vs'string x from t
x
----
Fred
Joe
Hank
Mary
这利用了功能vs和副词两者的组合:
假设x是符号类型的列:
q)update `$last each "."vs'string x from t
x
----
Fred
Joe
Hank
Mary
这利用了功能vs和副词两者的组合:
您可以使用
0:
实现这一点-这通常是字符串列表的最佳方法,与使用查找和删除或vs
相比,它对于较长的列表尤其有效:
q)update raze(" *";".")0:string c from t
x
----
Fred
Joe
Hank
Mary
这将有效地拆分
“
”上的字符串,丢弃返回的第一列(不在“*”
中指定它,将左参数的第一个元素指定为0:
),然后给出一个已登记的返回,需要将其夷为平地才能将其返回到列中的字符串列表中。为此,可以使用0:
-这通常是字符串列表的最佳方法,与使用查找和删除或vs
相比,它对于较长的列表尤其有效:
q)update raze(" *";".")0:string c from t
x
----
Fred
Joe
Hank
Mary
这将有效地拆分
“
”上的字符串,丢弃返回的第一列(不在“*”
中指定它,将左参数的第一个元素指定为0:
),然后给出一个已登记的返回,需要将其夷为平地才能将其返回到列中的字符串列表中。还有一种方法,有助于覆盖名称中包含“.”的情况:
update x:`${(1+x ?\:".")_'x} string x from t
逻辑是
x
转换为字符串1+x?\:“
(1+x?\:“)\ux
//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:
显然更快。如果您确定没有额外的点,则该方法更可取。还有一种方法,有助于涵盖名称中包含“.”的情况:
update x:`${(1+x ?\:".")_'x} string x from t
逻辑是
x
转换为字符串1+x?\:“
(1+x?\:“)\ux
//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
另一种方法是:
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
通过使用inter和.Q名称空间获得此结果的另一种方法
t:update {`$x inter .Q.a,.Q.A} each string x from t
x
----
Fred
Joe
Hang
您不需要串线和投射。。。最后,每一个'vs'x都会起作用,你不需要串和施法。。。最后,每个'vs'x都会起作用