1

我正在解析一个相当大的文件,我想定期更新一个进度条以指示到目前为止我已经解析了多少。

我能想到的最直接的方法是ParsecT用作 monad 转换器,IO这样我就可以提升打印进度条更新,并使用 aHandle作为流提供程序,这样我就可以使用hFileSizeand检查进度hTell

所以这意味着我需要一个实例Stream Handle IO Char。滚动我自己的(使用)应该不难,hGetChar但我想我会看看是否已经存在一个,以处理任何不可预见的问题(比如我是否需要插入一些缓冲以提高速度)。

4

1 回答 1

2

一种技巧是提前检查文件的大小。然后,在您进行解析时,检查SourcePosparsec 提供的可用以查看您已经走了多远。这样做的缺点是,如果您想跟踪实际字节数(以便您可以使用文件系统对文件大小的了解来避免两次遍历文件),您将不得不使用tokenPrim. 不过,解析器组合器不需要重新实现。

或者,您可以遍历文件两次并使用行数(在第一次遍历期间计算)来估计您已经走了多远。

于 2012-12-07T13:46:18.543 回答