Я думаю, что первая проблема в том, что вы не получаете правильное значение для детали из командной строки. .z.X
возвращает командную строку в виде списка токенов, а .z.x
возвращает то же самое, но без команды q и имени файла.
q test.q -p 5000 -partition a
q).z.X
"/opt/kdb/3.5/l32/q"
"test.q"
"-p"
"5000"
"-partition"
,"a"
q).z.X[6]
""
Используйте функцию .Q.opt
, чтобы превратить параметры командной строки в гораздо более надежный словарь.
q)params:.Q.opt .z.X
q)params
p | "5000"
partition| ,"a"
q)`$first params`partition
`a
Вторая проблема заключается в том, что "symPart*"
не будет оценивать переменную symPart
, поскольку она находится внутри кавычек. Все, что видит kdb + - это строка. Каждый цикл скрипта bash будет отправлять одну и ту же команду (`collect; `ts; "symPart*")
через дескриптор, с проверкой сбора для раздела "symPart"
, который, как я полагаю, не существует.
Чтобы передать его как переменную, вы можете изменить его на symPart,"*"
, но в этом случае symPart
должна быть строкой, а не символом, чтобы вы могли удалить приведение.
Вы можете изменить свой скрипт следующим образом:
/ start connection handles to remote server
h:hopen `::5000
/ convert command line arguments into dictionary and index to get partition letter
part:first .Q.opt[.z.X]`partition;
/ call server side functions
fetched:h (`collect; `ts; symPart,"*")
/ close connection handle
hclose h
Или сделать все это в одном сценарии q, вы можете сделать следующее:
/ start connection handles to remote server
h:hopen `::5000
/ call server side functions
fetched:.Q.a!h each (`collect; `ts),/: enlist each .Q.a,\:"*"
/ close connection handle
hclose h
.Q.a
содержит все строчные буквы в строке.
q).Q.a
"abcdefghijklmnopqrstuvwxyz"
Мы можем создать все подстановочные знаки, используя каждую левую \:
с ,
(объединение), чтобы присоединить каждую из них к "*"
, а затем создать несколько команд для отправки через дескриптор, используя каждое право /:
для присоединения неизменная левая сторона для всех различных подстановочных знаков.
q).Q.a,\:"*"
"a*"
"b*"
"c*"
"d*"
..
q)(`collect; `ts),/: enlist each .Q.a,\:"*"
`collect `ts "a*"
`collect `ts "b*"
`collect `ts "c*"
..
Обратите внимание, что выводом fetched
будет словарь с ключами в качестве разделов и извлеченным результатом каждого раздела в качестве соответствующего значения.