如何在kdb/q中检查有效的文件名格式?

如何在kdb/q中检查有效的文件名格式?,kdb,Kdb,我想检查一下我的目录中的文件名是否格式正确。首先,我创建一个变量dir,然后使用关键字key查看列出了哪些文件 q)dir:`:/myDirectory/data/files q)dirkey:key dir q)dirkey `FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json `FILEB_ABC_20190430_b556nyc1_OrderSale_000456.meta 我选择并解析.json文件名 q)dirjsn:dirke

我想检查一下我的目录中的文件名是否格式正确。首先,我创建一个变量
dir
,然后使用关键字
key
查看列出了哪些文件

q)dir:`:/myDirectory/data/files
q)dirkey:key dir
q)dirkey
`FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json
`FILEB_ABC_20190430_b556nyc1_OrderSale_000456.meta
我选择并解析
.json
文件名

q)dirjsn:dirkey where dirkey like "*.json"
q)sepname:raze{"_" vs string x}'[dirjsn]
"FILEA"
"XYZ"
"20190501"
"b233nyc9"
"OrderPurchase"
"000123.json"
接下来,我想确认
sepname[0]
sepname[1]
中的每个字符都是字母,
sepname[2]
中的字符是数字/时态的,
sepname[3]
包含字母数字值

优化以下顺序
if语句
性能的最佳方法是什么?如何检查字母数字值,如
sepname[3]
,而不仅仅是其中一个

q)if[not sepname[0] like "*[A-Z]";:show "Incorrect Submitter"];
  if[not sepname[1] like "*[A-Z]";:show "Incorrect Reporter"];
  if[not sepname[2] like "*[0-9]";:show "Incorrect Date"];
  if[not sepname[3] like " ??? ";:show "Incorrect Kind"];
  show "Correct File Format"

like
在这种情况下不起作用,因为我们需要检查每个字符。一种方法是在和之间使用

  q) a: ("FILEA"; "XYZ"; "20190501"; "b233nyc9")
创建一个字符集

  q) c: .Q.a, .Q.A
对于前3种情况,请检查每个字符是否属于特定集合:

  q) r1: all@'(3#a) in' (c;c;.Q.n)  / output 111b
对于字母数字大小写,请检查它是否同时包含数字和字符,并且没有其他符号

  q)r2: (sum[b]=count a[3]) & all b:sum@'a[3] in/: (c;.Q.n) / output 1b
打印输出/错误:

q) errors: ("Incorrect Submitter";"Incorrect Reporter";"Incorrect Date";"Incorrect Kind")
q) show $[0=count r:where not r1,r2;"All good";errors r]
q) "All good"

如果您的有效文件名总是具有相同的结构(特别是5个字符、3个字符、8个字符、8个字符),那么您可以使用单个regex
like
语句,如下所示:

dirjsn:("FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json";"F2ILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json";"FILEA_XYZ2_20190501_b233nyc9_OrderPurchase_000123.json";"FILEA_XYZ_2A190501_b233nyc9_OrderPurchase_000123.json";"FILEA_XYZ_20190501_b233%yc9_OrderPurchase_000123.json";"FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json");


q)dirjsn
FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json
F2ILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json
FILEA_XYZ2_20190501_b233nyc9_OrderPurchase_000123.json
FILEA_XYZ_2A190501_b233nyc9_OrderPurchase_000123.json
FILEA_XYZ_20190501_b233%yc9_OrderPurchase_000123.json
FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json

q)AZ:"[A-Z]";n:"[0-9]";Azn:"[A-Za-z0-9]";
q)dirjsn where dirjsn like raze(AZ;"_";AZ;"_";n;"_";Azn;"*")where 5 1 3 1 8 1 8 1
"FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json"
"FILEA_XYZ_20190501_b233nyc9_OrderPurchase_000123.json"

塔克斯,拉胡尔。您将如何在单例列表中执行与r1类似的功能,而不是在常规列表中执行,例如,上述注释的“OrderPurchase”解决方案:c中的“OrderPurchase”all@(a)/returns 1b all@(a)in.Q.n/returns 0b这是正确的。您还可以删除“@”<代码>c中的所有a都可以完成这项工作。这对于单个字符串列表非常有效。如果我有多个要同时检查的字符串列表呢?e、 g.
(“文件A”、“XYZ”、“20190501”、“b233nyc9”);(“文件B”、“ABC”、“20190524”、“c963lax8”);(“文件C”、“LMN”、“20190523”、“x465pxd3”))
你可以用副词来做。但最简单的方法是将
r1
r2
转换成函数,然后迭代
a
。这种方法的优点是r1和r2的代码将与普通列表的代码保持一致<代码>q)r1:{all@'(3#x)in'(c;c;.q.n)}每个a
q)r2:{(sum[b]=count x[3])&所有b:sum@'x[3]in/:(c;.q.n)}每个a
和最后的错误打印代码将是:
q){show$[0=count r:where not x;“all good”;errors r]}每个r1,