删除字符串KDB的一部分

删除字符串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

我有一个名为“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
这利用了功能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都会起作用