访问 kdb+/Q

时间:2021-06-18 15:00:38

标签: kdb q

以下脚本返回 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 


3 个答案:

答案 0 :(得分:2)

我做了一个小测试目录

 λ 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

这行得通吗?

答案 1 :(得分:2)

为了多样性,递归方法适用于任意嵌套的目录(类似于 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

答案 2 :(得分:1)

要添加到 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
相关问题