Hos*_*ork 3 file-io parsing rebol
我尝试在PORT上使用PARSE!它不起作用:
>> parse open %test-data.r [to end]
** Script error: parse does not allow port! for its input argument
Run Code Online (Sandbox Code Playgroud)
当然,如果您阅读以下数据,它会起作用:
>> parse read open %test-data.r [to end]
== true
Run Code Online (Sandbox Code Playgroud)
...但是在没有首先将它们加载到内存中的情况下,能够在大文件上使用PARSE似乎很有用.
有没有理由说PARSE 无法在PORT上工作!......还是仅仅没有实施?
简单的答案是不,我们不能......
解析的工作方式,它可能需要回滚到输入字符串的前一部分,当它满足流的最后一个字符时,实际上可能是完整输入的头部.
当端口从端口获取输入时,端口将其数据复制到字符串缓冲区,因此事实上,从来没有任何"先前"字符串可用于回滚.它就像量子物理学...只是看着它,它不再存在了.
但正如你所知道的那样......没有不是答案.;-)
这就是说,有一种方法可以解析来自端口的数据,但是需要更多的工作.
你要做的是使用缓冲区,和
APPEND buffer COPY/part connection amount
Run Code Online (Sandbox Code Playgroud)
根据您的数据,数量可以是1字节或1kb,使用有意义的.
将新输入添加到缓冲区后,解析它并添加逻辑以了解是否匹配了该缓冲区的一部分.
如果某些东西肯定匹配,你删除/分配从缓冲区匹配的内容,并继续解析直到没有解析.
然后重复上面直到你到达输入结束.
我在一个实时EDI tcp服务器中使用它,它有一个"永远在线"的tcp端口,以便分解(可能)连续的输入数据流,实际上是端到端地回送消息.
细节
设置此系统的最佳方法是使用/ no-wait和循环,直到端口关闭(您没有收到而不是"").
还要确保在解析时有一种方法可以检查数据完整性问题(例如跳过的字节或错误的消息),否则,您将永远无法达到目的.
在我的系统中,当缓冲液是超出特定大小,我试图其中跳过的字节,直到图案的替换规则可能被进一步发现往下流.如果找到一个,则记录错误,存储部分消息并为sysadmin引发警报以对消息进行排序.
HTH!