根据条件更改 table 中特定行的值

changing value of specific row in table with conditions

假设我有以下 table。

    t:([]date:5#.z.D; ric:`A.HK`B.HK`C.HK`D.KS`E.T);

从这里开始,我想删除结尾的字符串,包括“.”。如果满足某些条件。

以下是我一直在做的方式-但我想知道是否会有很多 efficient/faster 方式。

     newriclist: exec distinct ric from t;
     dummy:{ (`ric`newric)!(x; `$ssr[string[x]; ".KS"; ""]) } each newriclist;
     t lj `ric xkey dummy ...

或者,这就是我想要理想的实现,但似乎行不通。

    update ric:?[string[ric] like "*.KS"; `$ssr[string[ric]; ".KS"; ""]; ric] from `t;

使用上面的 table,您可以简单地执行以下操作:

q)update first each ` vs/:ric from `t where ric like "*.KS"
`t
q)t
date       ric
---------------
2018.02.24 A.HK
2018.02.24 B.HK
2018.02.24 C.HK
2018.02.24 D
2018.02.24 E.T

对于一些解释,这使用了你可以做到的事实

q)` vs `sym.suf
`sym`suf

无需字符串即可将您的符号分解为带点的组件。这需要应用 each-right (/:) 来对受影响的列元素进行操作。这将是 return 列表的列表,因此 first each 负责将其变回简单列表。这里的 where 条件负责确保它仅在正确的符号上运行。

作为一个快速扩展,如果您要对具有大量重复符号的大型 table 执行此操作,则使用 .Q.fu 将更有效地处理列表中的多个重复项:

update .Q.fu[{first each ` vs/:x};ric] from `t where ric like "*.KS"