我正在解析一个相当大的文件,我想定期更新一个进度条,以表明到目前为止我已经解析了多少。
我能想到的最直接的方法是使用ParsecT
作为IO
的monad转换器,这样我就可以解除打印进度条更新,并使用Handle
作为流提供商,以便我可以使用hFileSize
和hTell
检查进度。
这意味着我需要一个实例Stream Handle IO Char
。滚动我自己应该不难(使用hGetChar
),但我想我已经看到是否已存在,以处理任何不可预见的问题(比如我是否需要为速度插入一些缓冲)。
答案 0 :(得分:2)
一个hack就是提前检查文件的大小。然后,在解析时,检查parsec可用的SourcePos
以查看您已经获得了多远。这样做的缺点是,如果要跟踪实际字节数(以便您可以使用文件系统的文件大小知识来避免遍历文件两次),则必须使用{{3}手动重新实现基本解析器}。但是,解析器组合器不需要重新实现。
或者,您可以遍历文件两次并使用行计数(在第一次遍历期间计算)作为对您已经达到的距离的估计。