由于奇怪的文件,Haskell中的readProcess“grep”失败

时间:2016-08-22 18:42:02

标签: linux haskell encoding

我有一个包含奇怪字符的文件MAIL.txt(此文件来自Windows,我在Linux上)。它包含字符串rec。当我在终端中运行grep "rec" MAIL.txt时,我得到了预期的输出。

但是这个命令在Haskell中失败了:

Prelude System.Process> r <- readProcessWithExitCode "grep" ["rec", "MAIL.txt"] ""
*** Exception: fd:13: hGetContents: invalid argument (invalid byte sequence)

有什么解释,有没有办法避免这种情况(不修改奇怪的文件)?

以下是grep的输出,您可以在其中看到奇怪的字符:

enter image description here

事实上,这些应该是重音字母。

我无法使用readFile读取文件:

> r <- readFile "MAIL.txt"
> r
"Bonjour,\r\n\r\n Quelques remarques sur cette fiche :\r\n\r\n- *** Exception: MAIL.txt: hGetContents: invalid argument (invalid byte sequence)

也许有办法用Data.Binary检测问题?

解决方案

详细说明@ ErikR的回答:

import System.Process.ByteString (readProcessWithExitCode)
import Data.ByteString (ByteString, empty)
import qualified Data.ByteString.Char8 as B
import System.Exit (ExitCode)
(err, stdout, stderr) <- readProcessWithExitCode "grep" ["rec", "MAIL.txt"] empty
B.putStrLn stdout

1 个答案:

答案 0 :(得分:2)

使用process-extras包中的readProcessWithExitCodereadCreateProcessWithExitCode。他们返回ByteStrings:

readProcessWithExitCode :: FilePath -> [String] -> ByteString
       -> IO (ExitCode, ByteString, ByteString)

存在其他版本的返回延迟字节和文本。

编辑:更新了链接,因为不推荐使用process-listlike来支持进程附加功能。