Как проверить правильность формата имени файла в kdb / q? - PullRequest
1 голос
/ 01 мая 2019

Я бы хотел проверить, правильно ли отформатированы имена файлов в моем каталоге. Сначала я создаю переменную 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 ]

2 голосов
/ 01 мая 2019

Если ваши действительные имена файлов всегда имеют ту же структуру (в частности, 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 голос
/ 01 мая 2019

like не будет работать в этом случае, так как нам нужно проверить каждый символ.Один из способов сделать это - использовать in и inter:

  q) a: ("FILEA"; "XYZ"; "20190501"; "b233nyc9")

Создать набор символов

  q) c: .Q.a, .Q.A

В первых 3 случаях проверьте, принадлежит ли каждый символ к определенномуset:

  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"
...