2011-11-17 86 views
4

我有它的UTF-8字符的文件300MB(link)。我想寫一個相當於以下內容的haskell程序:快速分析大量的UTF-8文本文件在Haskell

cat bigfile.txt | grep "^en " | wc -l 

這在我的系統上以2.6秒運行。

現在,我在看文件作爲一個普通的字符串(READFILE),並且有這樣的:

main = do 
    contents <- readFile "bigfile.txt" 
    putStrLn $ show $ length $ lines contents 

幾秒鐘後,我得到這個錯誤:

Dictionary.hs: bigfile.txt: hGetContents: invalid argument (Illegal byte sequence) 

我承擔我需要使用更多的utf-8友好的東西?我怎樣才能使它和UTF-8兼容?我讀了關於Data.ByteString.Lazy的速度,但真實世界Haskell說它不支持utf-8。

+4

'grep的-c 「^恩」 bigfile.txt'更快。結果,無效的字節序列錯誤表示該文件不是有效的utf-8,或者您的文件句柄未設置爲utf-8。如果你的ghc是最近的,它會默認讀取區域設置編碼的文件,檢查它。如果它不是utf-8,'hSetEncoding stdin utf8'應該修復它。 –

回答

7

utf8-string提供了讀取和寫入字符串UTF8支持。它重新使用ByteString基礎設施,因此界面可能非常相似。

另一個Unicode字符串項目,這很可能是與上述有關,並且也由字節串的啓發在this Masters thesis討論。

+1

我覺得這很愚蠢,但是如何將文件作爲惰性utf8字符串讀取? Data.ByteString.Lazy.Char8有一個readFile方法,但是Data.ByteString.Lazy.UTF8沒有。 –

+0

@SeanClarkHess:見[System.IO.UTF8.readFile](http://hackage.haskell.org/packages/archive/utf8-string/latest/doc/html/System-IO-UTF8.html#v:readFile )。 – hammar

+0

啊,你使用Data.ByteString.Lazy.readFile,然後在ByteString上調用Data.ByteString.Lazy.UTF8的函數。謝謝! –