Переименование столбца таблицы его подстрокой в ​​KDB? - PullRequest
0 голосов
/ 10 июня 2019

Как мне переименовать столбец в KDB с его подстрокой?

Пример:

Исходная таблица

    name  | number
------------------
  foo/bar |  999
  foo/log |  999
  foo/ton |  999
  foo/tin |  999

Запрос должен усекатьсястолбец name с определенным разделителем, в случае символа /.

Результирующая таблица 1

    name  | number
------------------
    foo   |  999
    foo   |  999
    foo   |  999
    foo   |  999

Или удалить подстроку междустрока, то есть символ /.

Результирующая таблица 2

    name  | number
------------------
   foobar |  999
   foolog |  999
   footon |  999
   footin |  999

Ответы [ 2 ]

5 голосов
/ 10 июня 2019

Есть несколько способов сделать это.

t:([name:("foo/bar";"foo/log";"foo/ton";"foo/tin")]number:999 999 999 999)

Вы можете против , что позволяет разбить строку на разделитель.Например.ниже возвращается вложенный список двух составных строк, которые составили исходную строку.

q)"/" vs "foo/bar"
"foo"
"bar"

Здесь вы можете выбрать строку, которую хотите использовать в обновленном столбце.

q)last "/" vs "foo/bar"
"bar"

Или можете объединить вывод в одну строку, используя raze.

q)raze "/" vs "foo/bar"
"foobar"

Затем вы можете использовать эти методы в операторе обновления для вашей таблицы.В этом случае я использую each-right с оператором sv, чтобы оперировать каждой строкой в ​​столбце имени.Вы также можете использовать функцию для вызова с каждой строкой.(например, update name:{last "/" vs x}each name from t)

q)update raze each  "/" vs/: name from t
name    | number
--------| ------
"foobar"| 999
"foolog"| 999
"footon"| 999
"footin"| 999
q)update last each  "/" vs/: name from t
name | number
-----| ------
"bar"| 999
"log"| 999
"ton"| 999
"tin"| 999
q)update first each  "/" vs/: name from t
name | number
-----| ------
"foo"| 999
"foo"| 999
"foo"| 999
"foo"| 999

Для вашей первой таблицы результатов, если ваш путь к файлу всегда одинаковой длины, более простой метод мог бы использовать оператор take для каждой строки, как показано ниже.

q)update 3#'name from t
name | number
-----| ------
"foo"| 999
"foo"| 999
"foo"| 999
"foo"| 999
1 голос
/ 10 июня 2019

Для случая, когда вы просто хотите удалить подстроку, другой вариант должен использовать ssr, который заменит все вхождения подстроки целевой строкой / символом.

q) t:([name:("foo/bar";"foo/bar/thing")]number:999 1000)
name           | number
---------------| ------
"foo/bar"      | 999   
"foo/bar/thing"| 1000 
q) update ssr[;"/";""]@'name from t

Выход:

name         | number
-------------| ------
"foobar"     | 999   
"foobarthing"| 1000
...