2014-10-17 40 views
2

我已经包含在下列格式的数据列的表 - 让我们称之为列“标题”和表“的”获取子串放入一个新列

标题

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很新,所以毫无疑问,以一种非常愚蠢的方式做简单的事情。

回答

4

你得到类型错误的原因是因为ss只适用于字符串类型,而不是符号。 Plus 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

0

另一种方法是利用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运算符。