在 kdb 中转换字典

casting dictionary in kdb

我想转换字典并记录它。

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

当我做的时候

type value dict / 11h

但密钥看起来像代码

当我做的时候

type string value dict / 0h

我不知道为什么。

我想连接字符串并记录它。所以它会是这样的:

"The constraint is ",string key dict

但是没有用。约束将类似于每一行的每个字母。我如何转换字典以便连接并记录它。

查看 http://code.kx.com/q/ref/dotq/#qs-plain-text 以记录任意 kdb+ 数据类型。

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

这里发生了几件事。

  • dict 只有一对 key/value 但这个事实不会影响 keyvalue 的行为:它们 return 所有 个键和值。这就是为什么 type value dict11h,它是 个符号的列表。出于完全相同的原因,key dict,`code,其中逗号表示 enlistkey dict 符号列表 ,其中 (在您的特定示例中) 恰好只有一个符号 `code.

  • 应用于符号列表的
  • string 将该列表的每个元素转换为字符串,并且 returns 的列表字符串

  • q 中的字符串是一个简单的字符列表(有关简单列表和混合列表的更多信息,请参阅 http://code.kx.com/wiki/Tutorials/Lists

  • 当您将一个简单的字符列表 "The constraint is " 与一个字符串列表连接时,即一个字符列表的列表,结果不能再表示为一个简单的列表,而是一个通用的列表。这就是为什么 q 在加入之前将 "The constraint is " (简单列表)转换为 ("T";"h";"e",...) (通用列表)并且你 q 开始显示每个单独一行的字符。

我希望你现在明白发生了什么。根据您的需要,您可以像这样修复代码:

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

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

希望这对您有所帮助。

如果您正在寻找不错的日志记录,像这样的东西应该可以帮助您(并且是通用的) 遍历值,并转换为字符串

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]}/

字符串操作

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

例子

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

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

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

结果与执行

fs each (d;d2;d3)

您可以明显地根据您的确切需求进行定制 - 这没有针对复杂的字典值进行测试