无法获取q中的书面文件内容?

an *_*use 0 kdb

我复制了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
Run Code Online (Sandbox Code Playgroud)

查看目录,在那里创建文件.为什么我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
Run Code Online (Sandbox Code Playgroud)

事情变得正常,为什么?

Fio*_*gan 7

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

 `:D:/q4m/L set til 5
Run Code Online (Sandbox Code Playgroud)

之前.然而,这并没有做到

 `:D:/q4m/raw
Run Code Online (Sandbox Code Playgroud)

如果你要使用

 `:D:/q4m/raw set til 5
Run Code Online (Sandbox Code Playgroud)

或者

.[`:D:/q4m/raw;();:;()]
Run Code Online (Sandbox Code Playgroud)

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

另外,如果我们看一下二进制文件

read1 `:D:/q4m/raw
Run Code Online (Sandbox Code Playgroud)

read1 `:D:/q4m/L
Run Code Online (Sandbox Code Playgroud)

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

q)read1  `:D:/q4m/raw
0x2a000000000000000a0000000000000014000000000000001e00000000000000
Run Code Online (Sandbox Code Playgroud)

在q中,这并不意味着什么.第二种方法给出

q)read1 `:D:/q4m/L
0xfe2007000000000005000000000000000000000000000000010000000000000002000000000..
Run Code Online (Sandbox Code Playgroud)

这是一个合适的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
Run Code Online (Sandbox Code Playgroud)

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