gpt4 book ai didi

linux - 由于奇怪的文件,Haskell 中的 readProcess "grep"失败

转载 作者:太空狗 更新时间:2023-10-29 12:12:13 25 4
gpt4 key购买 nike

我有一个包含奇怪字符的文件 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

最佳答案

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

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

存在用于返回惰性字节串和文本的其他版本。

编辑:更新了链接,因为 process-liSTLike 已弃用,取而代之的是 process-extras。

关于linux - 由于奇怪的文件,Haskell 中的 readProcess "grep"失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39086584/

25 4 0
文章推荐: linux - 如何使用 sed 在一行中多次出现的两个模式之间搜索文本?
文章推荐: javascript - 如何让