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