Terry
Terry

Reputation: 519

casting dictionary in kdb

I want to cast dictionary and log it.

dict:(enlist`code)!(enlist`B10005)

when I do

type value dict / 11h

but the key looks like ,code

when I do

type string value dict / 0h

I am not sure why.

I want to concatenate with strings and log it. So it will be something like:

"The constraint is ",string key dict

But it did not work. The constraint will be like each letter for each line. How I can cast the dictionary so I can concatenate and log it.

Upvotes: 1

Views: 3179

Answers (3)

Connor Gervin
Connor Gervin

Reputation: 946

Have a look at http://code.kx.com/q/ref/dotq/#qs-plain-text for logging arbitrary kdb+ datatypes.

q)show dict:`key1`key2!`value1`value2
key1| value1
key2| value2
q).Q.s dict
"key1| value1\nkey2| value2\n"

Upvotes: 4

Sean O'Hagan
Sean O'Hagan

Reputation: 1697

if you are looking something for nice logging, something like this should help you(and is generic) iterate through values, and convert to strings

s:{$[all 10h=type each x;","sv x;0h~t:type x;.z.s each x;10h~t;x;"," sv $[t<0;enlist@;(::)]string x]}/

string manipulation

fs:{((,)string[count x]," keys were passed")," " sv/:("Key:";"and the values for it were:"),'/:flip (string key@;value)@\:s each x}

examples

d:((,)`a)!(,)`a

d2:`a`b!("he";"lo")

d3:`a`b!((10 20);("he";"sss";"ssss"))

results and execution

fs each (d;d2;d3)

you can tailor obviously to your exact needs - this is not tested for complex dict values

Upvotes: 1

Igor Korkhov
Igor Korkhov

Reputation: 8558

There are several things are going on here.

  • dict has one key/value pair only but this fact doesn't affect how key and value behave: they return all keys and values. This is why type value dict is 11h which is a list of symbols. For exact same reason key dict is ,`code where comma means enlist: key dict is a list of symbols which (in your particular example) happens to have just one symbol `code.

  • string applied to a list of symbols converts every element of that list to a string and returns a list of strings

  • a string in q is a simple list of characters (see http://code.kx.com/wiki/Tutorials/Lists for more on simple and mixed lists)

  • when you join a simple list of characters "The constraint is " with a list of strings, i.e. a list of lists of characters a result cannot be represented as a simple list anymore and becomes a generic list. This is why q converts "The constraint is " (simple list) to ("T";"h";"e",...) (generic list) before joining and you q starts displaying each character on a separate line.

I hope you understand now what's happening. Depending on your needs you can fix your code like this:

"The constraint is ",first string key dict / displays the first key

"The constraint is ",", "sv string key dict / displays all keys separated by commas

Hope this helps.

Upvotes: 1

Related Questions