通过句柄读取文件
Read file by its handle
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:
(q
中的read0
或0::
)这样的方式读取数据是否可以按名称(符号)读取文件,而不是通过打开句柄来读取文件。为什么不能从打开的句柄中读取?但是通过文件句柄写入是可以的。
更新:
谢谢,@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]
关于您的第一个问题,read0
可以从 system or process
句柄读取,而不是文件句柄。即,可以从标准输入读取。
我上面的观点确实回答了你的第二个问题,你应该通过文件名而不是打开句柄来阅读。
关于你为什么不能从打开的句柄读取,但你可以从它们写入的陈述 (And why one could not read from an open handle
)。这是因为两个因素,kdb 中的重载和约定。 kdb 中的约定是句柄用于在 kdb 中发送数据,而不是请求它们。我相信当您使用 `:path/to/file
进行交互时,kdb 确实会在后台打开一个文件句柄,我相信这被运算符重载隐藏了。您可以检查 /proc/PID/fd/
以确定句柄是否已打开
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:
(q
中的read0
或0::
)这样的方式读取数据是否可以按名称(符号)读取文件,而不是通过打开句柄来读取文件。为什么不能从打开的句柄中读取?但是通过文件句柄写入是可以的。
更新: 谢谢,@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]
关于您的第一个问题,read0
可以从 system or process
句柄读取,而不是文件句柄。即,可以从标准输入读取。
我上面的观点确实回答了你的第二个问题,你应该通过文件名而不是打开句柄来阅读。
关于你为什么不能从打开的句柄读取,但你可以从它们写入的陈述 (And why one could not read from an open handle
)。这是因为两个因素,kdb 中的重载和约定。 kdb 中的约定是句柄用于在 kdb 中发送数据,而不是请求它们。我相信当您使用 `:path/to/file
进行交互时,kdb 确实会在后台打开一个文件句柄,我相信这被运算符重载隐藏了。您可以检查 /proc/PID/fd/
以确定句柄是否已打开