kdb / q如何从列表中删除条目

时间:2018-02-20 08:07:01

标签: kdb

我正在尝试用相同的列连接几个csv。

getDataFromCsv :{[fn];
    if[not () ~key hsym fn; data: ("zSzzSISSIIIIIffffff"; enlist "\t") 0:fn;
    ... do stuff...
    :data];}

getFiles:{[dates;strat];root:"/home/me/data_";:{x: `$x, ssr[string y; "."; ""], ".csv"}[root] each dates;}


getData:{[dates;strat];`tasks set ([]c:());files:getFiles[dates;strat];:getDataFromCsv each files;}

这样做我得到一个表的列表,其中一些条目为空,其中没有文件

[0] = ([] c1;c2;c2 ...
[1] = ([] c1;c2;c2 ...
[2] = ([] c1;c2;c2 ...
[3] = ([] c1;c2;c2 ...
[4] = ([] c1;c2;c2 ...
[5] = ::
[6] = ([] c1;c2;c2 ...

通过这些条目,我无法对列表进行扫描以获得包含所有条目的表格。我该如何删除这些空条目?

2 个答案:

答案 0 :(得分:8)

如果列表中没有其他数据类型,您可以从类型不是98h的列表中删除以进行快速修复:

q)r
::
+`a`b`c!(41 48 29;2 8 6;5 8 5)
+`a`b`c!(41 48 29;2 8 6;5 8 5)
+`a`b`c!(41 48 29;2 8 6;5 8 5)
q)raze @[r;where 98h=type each r]
a  b c
------
41 2 5
48 8 8
29 6 5
41 2 5
48 8 8
29 6 5
41 2 5
48 8 8
29 6 5

这也假设每个输出的所有列都相同。如果不是,您可以使用uj合并列:

q)t:r,enlist ([] d:1 2 3; e:3 4 5)
q)(uj/)@[t;where 98h=type each t]
a  b c d e
----------
41 2 5
48 8 8
29 6 5
41 2 5
48 8 8
29 6 5
41 2 5
48 8 8
29 6 5
       1 3
       2 4
       3 5

答案 1 :(得分:5)

...个人

你在哪里" ......做些什么......"或者":数据",我只是检查数据的数量或添加类似的检查。如果count = 0,则返回一个空列表'()'而不是通用的null'(::)'您目前在函数中返回的内容。

通用null是此处的问题,而且是您要修复的内容。

以下示例......

// example returning generic null
q){if[x~0;:(::)];([]2?10)}each 1 0 3
+(,`x)!,4 4
::
+(,`x)!,7 9
q)raze {if[x~0;:(::)];([]2?10)}each 1 0 3
(,`x)!,6
(,`x)!,2
::
(,`x)!,9
(,`x)!,2

// put a check in against 'data' to return an empty list if count=0 or similar
q){if[x~0;:()];([]2?10)}each 1 0 3
+(,`x)!,3 2
()
+(,`x)!,1 8
// your raze works now
q)raze {if[x~0;:()];([]2?10)}each 1 0 3
x
-
3
1
7
2