2017-11-01 13 views
1

"t"という名前のテーブルに "x"という列があります。文字列の一部を削除します。

x 
------ 
1.Fred 
2.Joe 
3.Hank 
. 
. 
. 
500.Mary 

名前を前にしてすべてを削除する必要があります(例:「1」)。フレッドの前に。

私は 更新$2_'string x from tを試しましたが、それは一度大きな数字になってからではなく、数字1から9までしか機能しません。 "。"を削除する方法はありますか?それ以前のすべて?これは副詞と対各-両方の機能の組み合わせを利用

q)update `$last each "."vs'string x from t 
x 
---- 
Fred 
Joe 
Hank 
Mary 

答えて

2

名前を持っている場合をカバーするために役立ちますもう一つのアプローチで、ある '':

update x:`${(1+x ?\:".")_'x} string x from t 

ロジックは、string

    1. 変換シンボル列xでのインデックスを取得します。文字列リストの各要素の最初のドット1+x ?\:"."
    2. 最初のドットの前の切り取り文字(1+x ?\:".")_'x

    次のモデルは、テストのために使用することができます。

    //Create table with 100 random names 
    t: ([] ID: til 100; x: `$(string 1+til 100),'".",'(?[;"abc"] each 1+100?9),'" ",'(?[;"def"] each 1+100?9)); 
    //Replace space with dot for the last 10 names 
    t: update x: `$ssr[;" ";"."]'[string x] from t where ID>90; 
    update x:`${(1+x ?\:".")_'x} string x from t 
    

    @Ryanマカロンが提案し0:を使用しますが、明らかに高速です。追加のドットがない場合は、その方法が望ましいです。

  • 5

    - それはしばしば文字列のリストのための最良のアプローチであり、検索とドロップを使用するのと比較して長いリストの場合は特に役に立ちます。:

    q)update raze(" *";".")0:string c from t 
    x 
    ---- 
    Fred 
    Joe 
    Hank 
    Mary 
    

    これは、"."の文字列を効率的に分割して返します(" *"に左のargの最初の要素である0:に指定しないでリターンの最初の列をスローします)、必要な列に戻ってくる文字列のリストに戻すように荒らされる。

    関連する問題