q
可以创建文件并以一种很好的方式将其内容读回:
q)`:foo 0: ("bar";"baz")
`:foo
q)`:foo 0::
"bar"
"baz"
https://code.kx.com/q/ref/read0/说,没有人可以使用read0
从file or process handle
获取数据。但是由于某种原因,我无法从文件的句柄中获取任何数据。在q)read0[h]
之后看不到任何输出:
q)h:hopen `:foo
q)read0[h]
q)hclose h
此外,在.Q.fsn
的每一步中,它都使用1:(s;x;n)
读取下一部分数据,但不是通过打开的句柄(像其他编程语言一样)来读取数据:
k)fsn:{[f;s;n]
>[-7!s]
{[f;s;x;n]
i:(#r)^1 + last@&"\n"=r:1:(s;x;n);
f@`\:i#r;
x+i
}[f;s;;n]/0}
因此可以使用这样一种方法:使用1:
中的0:
或read0
(0::
中的q
或gen1day:{[date;n] ([]
sourcetime:`timestamp$date+asc 09:00:00.0 + n?08:00:00.0;
inst:n?(1000?`4); price:n?100f; size:n?10000;
e1:n?20; x:n?(`N`O`L`X); e2:n?10)
}
/memory, strings
("PSFJJSJ";enlist"|") 0: "|" 0: gen1day[2020.01.01;5]
/disk, `:t0 file
("PSFJJSJ";enlist"|") 0: read0 `:t0 0: "|" 0: gen1day[2020.01.01;5]
)来读取文件中的数据它们的名称(符号),而不是通过打开手柄来阅读它们。为何无法从打开的手柄中读取内容?但是通过文件句柄写入是可以的。
更新: 谢谢@CallumBiggs!
太好了!没有句柄,它看起来像是一个坚固且对称的api,例如:
{{1}}
答案 0 :(得分:2)
关于第一个问题,read0
可以从system or process
句柄而非文件句柄读取。即可以从标准输入中读取数据。
我的上述观点确实回答了您的第二个问题,您应按文件名阅读,而不要打开句柄。
关于您为何无法从打开的句柄读取,但可以从它们中写(And why one could not read from an open handle
)的陈述。这是由于两个因素造成的,即kdb中的重载和约定。 kdb中的约定是句柄用于在kdb中发送数据,而不是请求它们。我相信当您使用`:path/to/file
进行交互时,kdb确实会打开文件句柄,我相信这会被运算符重载隐藏。您可以检查/proc/PID/fd/
以确定句柄是否打开