Удалить часть строки KDB

У меня есть таблица с названием «t» со столбцом «x». Выглядит это так:

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

Мне нужно взять столбец и удалить все перед именем, например "1". перед Фредом.

Я пробовал обновить $2_'string x from t, но это работает только для номеров 1–9, а не после того, как я перейду к большим числам. Есть ли способ удалить "." а все до этого?


person michaelg    schedule 01.11.2017    source источник


Ответы (5)


Есть еще один подход, который помогает охватить случай, когда в имени есть '.':

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

Логика

  1. Преобразование столбца символов x в строку
  2. Получить индекс первой точки в каждом элементе списка строк 1+x ?\:"."
  3. Вырезать символы перед первой точкой (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

Хотя использование 0:, предложенного @Ryan McCarron, очевидно, быстрее. Если вы уверены, что дополнительных точек нет, этот подход предпочтительнее.

person Anton Dovzhenko    schedule 03.11.2017

Вы можете использовать для этого 0: - часто это лучший подход для списков строк и особенно хорошо работает для более длинных списков по сравнению с использованием поиска и отбрасывания или vs:

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

Это эффективно разбивает строку на ".", отбрасывает первый столбец возврата (не указывая его в " *", первом элементе левого аргумента на 0:), а затем дает перечисленный возврат, который необходимо сравнять с верните его в список строк, которые снова поместятся в столбце.

person Ryan McCarron    schedule 01.11.2017

Предполагая, что x - это столбец типа символа:

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

Здесь используется комбинация функции vs с наречием each-both: http://code.kx.com/q/ref/casting/#vs http://code.kx.com/q/ref/adverbs/#each-both

person jomahony    schedule 01.11.2017
comment
Вам не нужно натягивать и приводить ... last each` vs'x будет работать - person Chromozorz; 02.11.2017

Другой способ сделать это:

q)select (` vs/:x)[;1] from t
x
----
Fred
Joe
Hank
person nyi    schedule 31.08.2018

Другой способ получить этот результат, используя пространство имен inter и .Q

 t:update {`$x inter .Q.a,.Q.A} each string x from t
    
    x
    ----
    Fred
    Joe
    Hang

https://code.kx.com/q/ref/dotq/#qa-upper-case-alphabet
https://code.kx.com/q/ref/inter/

person astin dinesh    schedule 19.11.2020