2011-11-17 41 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的函数。谢谢! –