Получить подстроку в новый столбец

У меня есть таблица, которая содержит столбец с данными в следующем формате - позволяет назвать столбец "название" и таблицу "s"

заглавие

ab.123
ab.321 
cde.456
cde.654
fghi.789
fghi.987

Я пытаюсь получить уникальный список символов, которые стоят перед "." так что я заканчиваю с этим:

ab
cde
fghi

Я попытался выбрать начальный столбец в таблице, а затем попытался выполнить обновление, чтобы создать новый столбец, который является положением точки, используя «ss».

что-то вроде этого:

t: select title from s
update thedot: (title ss `.)[0] from t

Затем я собирался попытаться сделать 3-й столбец, который будет состоять из «N» символов из «заголовка», где N — значение, хранящееся в столбце «thedot».

Все, что я получаю, когда пытаюсь обновить, - это ошибка «типа».

Любые идеи? Я очень новичок в kdb, поэтому, без сомнения, делаю что-то простое очень глупым способом.


person spinon42    schedule 17.10.2014    source источник


Ответы (3)


причина, по которой вы получаете ошибку типа, заключается в том, что ss работает только со строковым типом, а не с символом. Кроме того, ss не является векторной функцией, поэтому вам нужно комбинировать ее с каждым '.

q)update thedot:string[title] ss' "." from t
title    thedot
---------------
ab.123   2
ab.321   2
cde.456  3
cde.654  3
fghi.789 4

Есть несколько способов решить вашу проблему:

q)select distinct(`$"." vs' string title)[;0] from t
x
----
ab
cde
fghi
q)select distinct(` vs' title)[;0] from t
x
----
ab
cde
fghi

Вы можете прочитать здесь для получения дополнительной информации: http://code.kx.com/q/ref/casting/#vs

person WooiKent Lee    schedule 17.10.2014

В качестве альтернативы можно использовать оператор 0: для анализа вокруг "." разделитель. Этот оператор особенно полезен, если у вас есть фиксированное количество «столбцов», как в CSV-файле. В этом случае, когда имеется фиксированное количество столбцов, и нам нужен только первый, список отдельных символов перед «.» можно вернуть с помощью:

exec distinct raze("S ";".")0:string title from t
`ab`cde`fghi

OR:

distinct raze("S ";".")0:string t`title
`ab`cde`fghi

Где "S " определяет типы каждого столбца, а "." — разделитель записей. Для записей с разным количеством столбцов лучше использовать оператор vs.

person Thomas Smyth    schedule 29.11.2017

Вариант ответа WooiKent с использованием each-right (/:) :

q)exec distinct (` vs/:x)[;0] from t
`ab`cde`fghi
person nyi    schedule 31.08.2018