访问 kdb+/Q 中的子文件夹

Access sub-folders in kdb+/Q

下面的脚本 returns Main_Dir 中包含的文件列表(仅包括文件夹)

path: `$":D:/Main_Dir/
files: key(path)

但是,我想访问位于子文件夹中的文件 (.csvs),其路径为:D:/Main_Dir/sub_dir1,D:/Main_Dir/sub_dir2...sub_dir3

此代码是较大子块的一部分,旨在读取驻留在子文件夹中的 csvs。

path: `$":D:/Main_Dir/
files: key(path)
loadcsv: {[path;file]("SDNFFFFJJ";enlist csv) 0: ` sv path,file}
d2: raze loadcsv[path] each files 

我做了一个小测试目录

 λ tree
.
├── subdir1
│   └── hi.csv
├── subdir2
│   └── hi.csv
└── subdir3
    ├── hi.csv
    └── hi.txt

3 directories, 4 files

您可以做的是列出文件的所有完整(相对)路径,然后使用 like.

过滤掉那些不是 csv 的文件
q)paths: paths where (paths: raze {` sv' dir ,/: key dir: hsym x} each key `:.) like "*.csv"
`:subdir1/hi.csv`:subdir2/hi.csv`:subdir3/hi.csv

然后您可以使用 each 来读入这些文件。

{[path] ("SDNFFFFJJ";enlist csv) 0: path} each paths

这行得通吗?

要添加到 Matthews 答案并提供不同的方法 - 您可以使用带有 linux 'find' 实用程序的系统命令。使用相同的目录结构 -

q)hsym `$system"find . -type f -name '*.csv'"
 `:subdir1/hi.csv`:subdir2/hi.csv`:subdir3/hi.csv

Matthews 的回答要好得多,我会避免在生产系统中使用系统命令,但在这种情况下,它是一个更简单的解决方案。

++ 编辑 - 注意你在 windows 你可以使用

q)hsym `$system"dir *.csv /b/s"
 `:subdir1/hi.csv`:subdir2/hi.csv`:subdir3/hi.csv

为了多样性,适用于任意嵌套目录的递归方法(类似于 MurrMacks 的回答):

q){$[{x~key x}y;(();y)y like x;raze .z.s[x]each` sv'y,'key y]}["*.csv";`:.]
`:./dir1/f1.csv`:./dir3/f3.csv`:./dir3/subdir1/f3s.csv`:./dir3/subdir1/subsubdir2/f3ss.csv