2012-12-06 67 views
1

我正在解析一個相當大的文件,並且我想定期更新一個進度條以表明迄今爲止我已經解析了多少文件。是否有一個實例流處理Text.Parsec.Stream的IO字符?

我能想到這樣做的最直接的方法是使用作爲一個單子轉換爲IO這樣我就可以解除印刷進步黨欄更新,並使用Handle作爲流供應商,所以我可以使用hFileSize檢查進度和hTell

這意味着我需要一個實例Stream Handle IO Char。我不應該很難推出自己的(使用hGetChar),但我想我會看看是否已經存在,以處理任何未解決的問題(比如我是否需要插入一些緩衝以提高速度)。

+0

另一個未解決的問題:[backtracking!](http://www.haskell.org/pipermail/haskell-cafe/2008-February/039059.html) – rampion

+0

您可以提前查詢文件大小,只需使用通常懶惰的IO + Stream String m Char實例(它已經爲你跟蹤了一個'SourcePos')?這可能有點激動人心,但不會比你在你的問題中提出的建議更有活力。 –

+0

Daniel Wagner:它看起來像'SourcePos'沒有追蹤絕對偏移量,只是行/列,所以我不得不預先計算行數。 – rampion

回答

2

一個黑客可能會提前檢查文件的大小。然後,在解析時,請檢查parsec提供的SourcePos以查看您獲得的距離。缺點是如果你想跟蹤實際的字節數(這樣你就可以使用文件系統的文件大小的知識來避免遍歷文件兩次),你將不得不使用tokenPrim手動重新實現基本解析器。不過,解析器組合器不需要重新實現。

或者,您可以遍歷該文件兩次,並使用行數(在第一次遍歷期間計算)作爲估計您已經獲得的距離。

相關問題