2012-12-06 2 views
1

상당히 큰 파일을 구문 분석 중이며 진행률 막대를 주기적으로 업데이트하여 지금까지 구문 분석 한 파일의 양을 나타냅니다. 내가이 일을 생각할 수Text.Parsec.Stream에 대한 스트림 핸들 IO Char가 있습니까?

가장 직접적인 방법은 내가 hFileSize를 사용하여 진행 상황을 확인할 수 있도록 나는 PROGRES 바 업데이트를 인쇄 올릴 수 IO위한 모나드 변압기로 를 사용하여 스트림 업체로 Handle를 사용하고 hTell.

그래서 인스턴스 Stream Handle IO Char이 필요합니다. 그것은 내 자신의 롤 (내사용) 어렵지 않아야하지만 만약 내가 이미 속도를 위해 몇 가지 버퍼링을 삽입 할 필요가 있는지 여부와 같은 모든 unforseen 문제를 처리하기 위해 존재했다 볼 것입니다.

+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을 사용하여 수동으로 기본 파서를 다시 구현해야한다는 것입니다. 그러나 파서 연결자는 다시 구현할 필요가 없습니다.

번갈아 가며 파일을 두 번 통과 한 다음 줄 수 (첫 번째 통과 중 계산)를 사용하여 얼마나 멀리 있는지 추정 할 수 있습니다.

관련 문제