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

时间:2019-05-01 15:51:39

标签: 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: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 statements的性能的最佳方法是什么?如何检查字母数字值(例如在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"

2 个答案:

答案 0 :(得分:2)

如果您的有效文件名始终具有相同的结构(特别是5个字符,3个字符,8个字符,8个字符),则可以使用单个正则表达式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"

答案 1 :(得分:1)

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

  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"