在q中的目录中获取路径名文件

时间:2019-01-31 16:00:59

标签: kdb

我正在使用q来获取该目录中列出的所有文件:

key `:Dname

,然后尝试过滤出以数字开头的数字:

key `:Dname like "[0-9]"

,但是相似部分无法正常工作。我也尝试过get,因为我喜欢包含文件所在目录的路径。

2 个答案:

答案 0 :(得分:3)

请记住,q从右到左评估表达式。您的代码将首先评估

`:Dname like "[0-9]"

并将key应用于结果。

您想要更近一点

key[`:Dname] like "[0-9]"

但是要获得所需的内容,必须在提供的模式字符串中添加通配符,并将not应用于结果

not key[`:Dname] like "[0-9]*"

这将为您提供布尔向量,以返回您要在其中使用的文件列表和索引:

key[`:Dname] where not key[`:Dname] like "[0-9]*"

答案 1 :(得分:2)

如果文件名定义为

filename:`2019.01.20file.txt

您可以使用like将其与模式进行比较,类似于您所做的事情:

filename like "[0-9]*"
  • "*"是通配符,表示[0-9]之后的所有内容都可以出现

  • like将字符串或符号与模式进行比较

因此,如果文件名以0到9之间的数字开头,则此行返回1b。

另一种方法是将文件名的开头与.Q.n(它是一个0-9的字符串)进行比较。 可以这样实现:

first[string filename] in .Q.n
  • string将符号转换为in的字符串,以将其与字符串.Q.n
  • 进行比较。

针对您的情况,我建议使用第一种方法。

q)key `:q
`README.txt`q.k`q.q`s.k`sp.q`w32
q)key[`:q] like "q*"
011000b
q)x where (x:key[`:q]) like "q*"
`q.k`q.q
q)x where not (x:key[`:q]) like "q*"
`README.txt`s.k`sp.q`w32

此方法返回布尔值列表,该列表指示每个文件是否以“ q”开头:

  • 使用not反转此列表的1和0。
  • 使用where返回布尔列表等于1的索引
  • 使用此列表索引到key[`:q]

我希望这对您有帮助