KDB按固定分隔符分割

时间:2017-09-07 04:48:13

标签: kdb

我有一个包含xmls的列

<Options TE="2017/09/01, 16:45:00.000" ST="2017/09/01, 09:00:00.000" TT="2017/09/01, 16:45:00.000"/>
<Options TE="2017/09/01, 16:45:00.000" ST="2017/09/01, 09:00:00.000" TT="2017/09/01, 16:45:00.000"/>
<Options TE="2017/09/04, 16:45:00.000" ST="2017/09/04, 09:00:00.000" TT="2017/09/04, 16:45:00.000"/>

我想分列

TE, ST, TT

数据类型为C

对kdb / q不太熟悉我试图以非常手动的方式。首先删除了开始和结束标记

x:update `$ssr[;"<Options";""] each tags from x
x:update `$ssr[;"/>";""] each string tags from x

给我留下像

这样的行
TE="2017/09/01, 16:45:00.000" ST="2017/09/01, 09:00:00.000" TT="2017/09/01, 16:45:00.000"

然后,拆分字符串

select `$"\"" vs' string tags from  x

给我一​​个列表,其中奇数条目是我的时间。我只是无法弄清楚如何获取该列表并将其拆分为单独的列。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我采取了稍微不同的方法,但以下应该做你想做的事:

//Clean the tags up for separation
//(get rid of open/close tags, change ", " to "," for ease of parsing and remove quote marks) 
x:update tags:{ssr/[x;("<Options ";"/>";", ";"\"");("";"";",";"")]} each tags from x


//Parse the various tags using 0:, put the result into a dictionary,
//exec out to table form and add to x
x:x,'exec (!) ./: ("S= " 0:/: tags) from x

在此参考我使用的表格:

x:([] tags:("<Options TE=\"2017/09/01, 16:45:00.000\" ST=\"2017/09/01, 09:00:00.000\" TT=\"2017/09/01, 16:45:00.000\"/>";
"<Options TE=\"2017/09/01, 16:45:00.000\" ST=\"2017/09/01, 09:00:00.000\" TT=\"2017/09/01, 16:45:00.000\"/>";
"<Options TE=\"2017/09/04, 16:45:00.000\" ST=\"2017/09/04, 09:00:00.000\" TT=\"2017/09/04, 16:45:00.000\"/>"))

答案 1 :(得分:0)

疯狂的想法:您的XML数据 是否经常查看,以便可以通过索引选择“列”。如果是这样,假设数据(上面)在3元素的字符串列表中,是否可能将某个函数foo应用于:

foo xmllist[;ind]

其中ind选择所需的数据。函数foo将通过使用(types; delimiter)0:...来进行必要的时间戳数据类型转换。

答案 2 :(得分:0)

看看你是否可以将XML文件导出到JSON文件中。 kdb + / q有一个json解析器,可以为你完成所有脏工作。 .j.k.j.j

参考:http://code.kx.com/q/cookbook/websockets/#json