KDBでこれをうまく行う方法はありますか?
テーブルを検討してください
X:([]a:1 2 3;b:`abc11`abc22`abc33;c:10 20 30)
次のように、2 番目の列の記号から「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
最初の 3 文字を取り除きます。
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
他の回答で提案されているようにラムダを使用することは問題ありませんが、この質問には必要ありません。副詞のみを使用して何かを達成できる場合、通常はそれが望ましいです。
Y: update `$ 3_'string b from X
より短く、読みやすくなっています。私のマシンでは、2 倍の速度で実行されます。
Y: update `$ ssr[;"abc";""] each string b from X
わずかに速く実行されます。両方を `symbol.
状況がより一般的で、最初の数字の前にあるものをすべて削除したい場合は、以下のようにすることができます。シンボルタイプのすべての列にさらに一般化できます
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