Parsing 在haskell中快速解析大型utf-8文本文件

Parsing 在haskell中快速解析大型utf-8文本文件,parsing,haskell,utf-8,Parsing,Haskell,Utf 8,我有一个300MB的文件,里面有utf-8字符。我想编写一个haskell程序,相当于: cat bigfile.txt | grep "^en " | wc -l 这在我的系统上以2.6秒的速度运行 现在,我正在以普通字符串读取文件的形式读取该文件,并具有以下内容: main = do contents <- readFile "bigfile.txt" putStrLn $ show $ length $ lines contents 我想我需要使用更友好的utf-

我有一个300MB的文件,里面有utf-8字符。我想编写一个haskell程序,相当于:

cat bigfile.txt | grep "^en " | wc -l
这在我的系统上以2.6秒的速度运行

现在,我正在以普通字符串读取文件的形式读取该文件,并具有以下内容:

main = do
    contents <- readFile "bigfile.txt"
    putStrLn $ show $ length $ lines contents
我想我需要使用更友好的utf-8?如何使其既快速又兼容utf-8?我读过关于Data.ByteString.Lazy的文章,但现实世界中Haskell说它不支持utf-8

软件包支持读取和写入UTF8字符串。它重用ByteString基础结构,因此接口可能非常相似


中讨论了另一个Unicode字符串项目,该项目可能与上述内容相关,也受到ByteStrings的启发。

问这个问题我觉得很愚蠢,但如何将文件作为惰性utf8字符串读取?Data.ByteString.Lazy.Char8有一个readFile方法,但是Data.ByteString.Lazy.UTF8没有。@SeanClarkHess:See.Ah,使用Data.ByteString.Lazy.readFile,然后调用Data.ByteString.Lazy.UTF8在ByteString上的函数。谢谢@哈马尔-不,那不行,因为它把它读入一个字符串。Data.ByteString.Lazy.readFile有效though@SeanClarkHess字体啊,我还以为这就是你想要的。无论如何,对于您的特定用例,您应该能够完全忽略编码,因为您只比较ASCII范围内的字符,并且UTF-8从不将ASCII范围内的字节作为多字节字符的一部分。grep-c^en bigfile.txt更快。另外,无效字节序列错误表示文件无效utf-8或文件句柄未设置为utf-8。如果您的ghc是最新版本,默认情况下它将读取区域设置编码中的文件,请检查该选项。如果它不是utf-8,那么hSetEncoding stdin utf8应该可以修复它。
Dictionary.hs: bigfile.txt: hGetContents: invalid argument (Illegal byte sequence)