2014-04-21 101 views
4

任何想法如何在KDB中很好地做到这一点?KDB;从符号列剥离字符

考虑表

X:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30) 

我现在想的是有 “ABC” 在第二列剥出符号的新表Y,使得:

Y:([]a:1 2 3;b:`11`22`33;c:10 20 30) 

回答

6
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

不要忘记退回到'符号。 – mollmerx

+0

使用.Q.fu的不错提示 – nightTrevors

0

使用Lambda表达式的建议在对方的回答是好的,但这个问题没有必要。如果单独使用副词就可以实现,那通常是可取的。

Y: update `$ 3_'string b from X 

更短且更具可读性。在我的机器上它的运行速度也快两倍。

Y: update `$ ssr[;"abc";""] each string b from X 

只运行稍快。我已经把两个都回到了'符号。

0

我试图在大型数据库都提到溶液(Ryan和mollmerx)(100000行),我得到了以下结果:

ssr花了大约645ms(平均值)

cut版本花了约40毫秒(平均)

我尝试了另一种解决方案,证明其速度更快。如果我们使用一个表的字典行为:

t[`b]: `$3_'string t`b 

这花了大约12毫秒的平均。

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}[email protected]] 
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