Я пишу сценарий kdb/q, который каким-то образом должен запрашивать ввод пользователя, а затем добавлять этот ввод в несколько предварительно отформатированных запросов. Предложения о том, как запрашивать/принимать ввод и параметризовать запросы?
Параметризация скрипта kdb q
Ответы (4)
Вы можете принять пользовательский ввод, используя read0 0
, который ждет, чтобы поймать все типы пользователей, пока они не нажмут ввод. Затем ввод будет возвращен в виде строки. Вы можете либо ввести это в активный сеанс q, либо обернуть его в функцию, подобную этой:
q)f:{a:read0 0;show a}
q)f[]
12
"12"
В этом случае я набрал 12
, который возвращается как строка "12"
.
Что касается параметризации запросов, то это можно сделать через строки, но это, так сказать, не очень q. Вам лучше привести входы к другому типу и использовать функциональную форму или даже стандартные выборки, например:
q)tab:([]a:1 2 3 4)
q){input:"J"$read0 0;select from tab where a=input}[]
4
a
-
4
Подробнее о функциональной форме можно прочитать на Kx wiki.
Вы также можете передать ввод в качестве аргументов командной строки, используя .z.x
& .Q.opt
:
$ q -item cam
q)p:.Q.opt .z.x
q)p`item
item| "cam"
q)select from tab where items=first `$p`item
items sales prices
------------------
cam 0 15
Оформить read0
, чтобы прочитать входные данные из консоли.
q)rl:{1">> "; value "select from tab where items=`",read0 0}
q)rl`
>> cam
items sales prices
------------------
cam 0 15
Для пользовательского ввода вы можете использовать read0
в дескрипторе файла 0
— стандартный ввод. Приглашение пользователя будет напечатано в стандартный вывод (файловый дескриптор 1
) следующим образом:
1 "Please give me some input: ";
input: read0 0;
Для параметризации запроса вы можете использовать конкатенацию строк функциональной формы запроса, как описано здесь (code. kx.com)