我想检查目录中的文件名是否都正确设置了格式。首先,我创建一个变量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"
答案 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
在这种情况下不起作用,因为我们需要检查每个字符。一种方法是使用in
和inter
:
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"