任何想法如何在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)
任何想法如何在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)
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
使用Lambda表達式的建議在對方的回答是好的,但這個問題沒有必要。如果單獨使用副詞就可以實現,那通常是可取的。
Y: update `$ 3_'string b from X
更短且更具可讀性。在我的機器上它的運行速度也快兩倍。
Y: update `$ ssr[;"abc";""] each string b from X
只運行稍快。我已經把兩個都回到了'符號。
我試圖在大型數據庫都提到溶液(Ryan和mollmerx)(100000行),我得到了以下結果:
ssr
花了大約645ms(平均值)
cut
版本花了約40毫秒(平均)
我嘗試了另一種解決方案,證明其速度更快。如果我們使用一個表的字典行爲:
t[`b]: `$3_'string t`b
這花了大約12毫秒的平均。
如果您的情況更一般,而且您想在第一個數字前刪除所有內容,那麼您可以執行下面的操作。你可能會進一步推廣到所有列與符號類型
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
不要忘記退回到'符號。 – mollmerx
使用.Q.fu的不錯提示 – nightTrevors