2016-08-22 9 views
2

私は奇妙な文字を含むMAIL.txtファイルを持っています(このファイルはWindowsから来ていて、私はLinuxです)。それは文字列recを含んでいます。ターミナルでgrep "rec" MAIL.txtを実行すると、予想される出力が得られます。奇妙なファイルのためにHaskellのreadProcess "grep"に失敗しました

ただし、このコマンドは、Haskellで失敗します。

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

説明は何であると(変なファイルを変更せずに)それを回避するための方法ですが?これらの文字をアクセントする必要があります実際には

enter image description here

:ここ

あなたは奇妙な文字を見ることができるgrepの出力です。

私は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の答え@細部へのソリューション

process-extrasパッケージから

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 
+0

ファイルの正確なエンコーディングを知っていますか? – danidiaz

+0

おそらく、ファイルはlatin-1でエンコードされています。これはHaskell(今日のLinuxのほとんどのアプリケーション)がutf8としてデコードしようとしているときです。 – chi

+0

私はアクセント付きのlatin-1ファイルでreadFileを試しましたが、Haskellは\ 218のような文字コードを表示しますが、クラッシュしません。問題が発生した小領域にファイルを縮小して投稿するようにしてください。 –

答えて

2

使用readProcessWithExitCodereadCreateProcessWithExitCode。彼らはByteStringsを返します:

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

リターンレイジーBytestringsとテキストのための他のバージョンが存在します。

編集:process-listlikeはprocess-extrasの代わりに廃止されたため、リンクが更新されました。

+0

ありがとう、後で試してみます。これは重要ではない、私はちょうどハスケルで遊んでいる:) –

+0

@StéphaneLaurentByteStringは文字ではなくバイトを含んでいることを覚えておいてください - あなたがテキスト処理をしたいなら、あなたはそれを 'Text'にデコードして開始するかもしれません実際の処理そのためには、エンコーディングを指定してライブラリを使用する必要があります。 – chi

+0

うまく動作します!ありがとうございました。 –

関連する問題