首页 > 解决方案 > q中无法获取写入的文件内容?

问题描述

我已将确切的示例复制q for mortals如下:

q)h:hopen `:D:/q4m/raw
q)h[42]
548i
q)h 10 20 30
548i
q)hclose h
q)get `:D:/q4m/raw
'D:/q4m/raw
  [0]  get `:D:/q4m/raw

查看目录,文件是在那里创建的。为什么我不能get呢?

相反,如果我这样做:

q)h:hopen `:D:/q4m/L
q)h[42]
628i
q)h[10 20 30]
628i
q)hclose h
q)get `:D:/q4m/L
0 1 2 3 4 42 10 20 30

事情变得正常了,为什么?

标签: kdb

解决方案


在测试给定代码后,我相信您的问题可能在于您如何初始化文件。我假设在有效的代码中你使用了一些变体

 `:D:/q4m/L set til 5

前。然而,这不是为

 `:D:/q4m/raw

如果你要使用

 `:D:/q4m/raw set til 5

或者

.[`:D:/q4m/raw;();:;()]

事先然后第一组代码将起作用。

此外,如果我们使用

read1 `:D:/q4m/raw

read1 `:D:/q4m/L

并且输出不包括开头附近的 07 ,那么它不会被识别为正确的 kdb 列表。也就是说,hopen 只是简单地附加到二进制文件而不是修改它。(如果您注意到指示列表长度的 05 字节,那么当您通过句柄添加时,这不会增加)。例如。你得到的第一个方法

q)read1  `:D:/q4m/raw
0x2a000000000000000a0000000000000014000000000000001e00000000000000

这在 q 中并没有真正的意义。第二种方法给出

q)read1 `:D:/q4m/L
0xfe2007000000000005000000000000000000000000000000010000000000000002000000000..

这是一个正确的 kdb 列表(注意 07 表示类型)。

如果您希望只阅读 /q4m/raw ,那么我建议设置一个空列表,希望到该列表并将其传递 `:D:/q4m/raw 如下

q)`:empty set 0#0
`:empty
q)h:hopen `:empty
q)h read1 `:D:/q4m/raw
3i
q)get `:empty
42 10 20 30

这仅在所有条目都是相同类型时才有效。


推荐阅读