2017-11-01 7 views
1

"t"라는 테이블과 "x"열이 있습니다. 그것은 다음과 같습니다 :문자열의 일부를 제거합니다. KDB

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 

논리는 문자열

    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

    - 종종 문자열 목록에 가장 적합한 방법이며 찾기 및 놓기와 비교하여 긴 목록의 경우 특히 유용합니다. vs :

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

    이렇게하면 "."에있는 문자열을 효율적으로 분할하여 반환의 첫 번째 열을 버리고 (" *"에 입력하고 왼쪽의 첫 번째 요소 인 0:에 지정하지 않음) 입회 한 결과를 제공합니다. 그것을 열에 다시 넣을 수있는 문자열 목록으로 되돌려 놓아야합니다.