1

q可以创建一个文件并以一种很好的方式读回它的内容:

q)`:foo 0: ("bar";"baz")
`:foo
q)`:foo 0::
"bar"
"baz"

https://code.kx.com/q/ref/read0/表示可以用来read0file 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:or 0:read00::in q)的方法通过文件名(符号)从文件中读取数据,而不是通过打开句柄来读取它们。为什么不能从打开的句柄中读取?但是通过文件句柄编写是可以的。


更新: 谢谢,@CallumBiggs!

伟大的!如果没有句柄,它看起来像一个实体且对称的 api,例如:

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]
4

1 回答 1

2

关于您的第一个问题,read0可以从system or process句柄而不是文件句柄中读取。即,可以从标准输入中读取。

我上面的观点确实回答了您的第二个问题,您应该按文件名阅读,而不是通过打开句柄阅读。

关于您关于为什么您无法从打开的句柄中读取但您可以从它们中写入的声明(And why one could not read from an open handle)。这是因为两个因素,kdb 中的重载和约定。kdb 中的约定是句柄用于在 kdb 中发送数据,而不是请求它们。我相信,当您使用 进行交互时,kdb 确实会打开一个文件句柄`:path/to/file,我相信这被运算符重载所隐藏。您可以检查/proc/PID/fd/以确定是否打开了句柄

于 2020-05-18T12:00:38.100 回答