访问 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
下面的脚本 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
.
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