我有一个300MB的文件(链接),其中包含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可以提高速度,但Real World Haskell说它不支持utf-8。
grep -c "^en " bigfile.txt
。无效字节序列错误意味着文件不是有效的UTF-8格式,或者您的文件句柄没有设置为UTF-8。如果您的 GHC 版本较新,它会默认以本地编码读取文件,请检查一下。如果不是UTF-8,请使用hSetEncoding stdin utf8
来修复。 - Daniel Fischer