Параметризация скрипта kdb q

Я пишу сценарий kdb/q, который каким-то образом должен запрашивать ввод пользователя, а затем добавлять этот ввод в несколько предварительно отформатированных запросов. Предложения о том, как запрашивать/принимать ввод и параметризовать запросы?


person man_of_dalmasca    schedule 24.10.2018    source источник


Ответы (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.

person Thomas Smyth    schedule 24.10.2018

Вы также можете передать ввод в качестве аргументов командной строки, используя .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
person nyi    schedule 24.10.2018

Оформить read0, чтобы прочитать входные данные из консоли.

q)rl:{1">> "; value "select from tab where items=`",read0 0}
q)rl`
>> cam
items sales prices
------------------
cam   0     15
person nyi    schedule 24.10.2018

Для пользовательского ввода вы можете использовать read0 в дескрипторе файла 0 — стандартный ввод. Приглашение пользователя будет напечатано в стандартный вывод (файловый дескриптор 1) следующим образом:

1 "Please give me some input: ";
input: read0 0;

Для параметризации запроса вы можете использовать конкатенацию строк функциональной формы запроса, как описано здесь (code. kx.com)

person Bartosz Kaliszuk    schedule 24.10.2018