如何在KDB中很好地做到这一点?
考虑表
X:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
我现在想要一个新的表Y,它从第二列的符号中删除了“abc”,这样:
Y:([]a:1 2 3;b:`11`22`33;c:10 20 30)
答案 0 :(得分:7)
q)t:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
q)t
a b c
----------
1 abc11 10
2 abc22 20
3 abc33 30
剥去前三个字符:
q)update `$3_'string b from t
a b c
---------
1 11 10
2 22 20
3 33 30
或搜索和替换:
q)update `$ssr[;"abc";""] each string b from t
a b c
---------
1 11 10
2 22 20
3 33 30
如果表格很大并且有许多重复项目,请考虑使用.Q.fu:
q)t:1000000#([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
q)\t r1:update `$3_'string b from t
111
q)\t r2:update .Q.fu[{`$3_'string x};b] from t
5
q)r1~r2
1b
答案 1 :(得分:1)
在其他答案中建议使用lambdas很好,但对于这个问题不是必需的。如果单独使用副词可以实现某些目标,那通常是可取的。
Y: update `$ 3_'string b from X
更短,更易读。在我的机器上,它的运行速度也是原来的两倍。
Y: update `$ ssr[;"abc";""] each string b from X
只会稍快一点。我把它们都扔回了'符号。
答案 2 :(得分:0)
我在大型数据库(100000行)上尝试了两个提到的解决方案(由ryan和mollmerx提供),我得到了以下结果:
ssr
花了大约645毫秒(平均值)
cut
版本大约需要40毫秒(平均值)
我尝试了另一种解决方案,证明速度更快。如果我们使用表的字典行为:
t[`b]: `$3_'string t`b
平均花费大约12毫秒。
答案 3 :(得分:0)
如果您的情况更为一般,并且您希望在第一个数字之前删除所有内容,那么您可以执行以下操作。您可以进一步概括为符号类型
的所有列q)show r1:update b:`${(first each where each x in .Q.n)_'x}string b from X
a b c
-------
1 11 10
2 22 20
3 33 30
q)show r2:@[X; exec c from meta X where t="s"; `${(first each where each x in .Q.n)_'x}string@]
a b c
-------
1 11 10
2 22 20
3 33 30
q)r1~r2
1b
当然,我不知道你的设置是什么,但在我的机器上,这很快。不像你的字典方法那么快,但可能值得牺牲普遍性
q)\ts update b:`${(first each where each x in .Q.n)_'x}string b from X
69 12746848j
答案 4 :(得分:0)
要添加到@Ryan Hamilton的答案中,下面是一个示例,如果您要去除最后两个字符:
q)update `$-2_'string b from t
a b c
---------
1 abc 10
2 abc 20
3 abc 30