1

テキストファイルのリストを引数として取り、各行がファイル内の対応する行間のタブのインターカレーションであるファイルを出力するプログラムを書いています。

すべての文字が ASCII エンコードされていると仮定します

import GHC.IO.Handle
import System.IO
import System.Environment
import Data.List

main = do
    (out:files) <- getArgs
    hs <- mapM (`openFile` ReadMode) files
    txts <- mapM B.hGetContents hs
    let final = map (B.intercalate (B.singleton '\t')) . transpose 
                . map (B.lines . B.filter (/= '\t')) $ txts
    withFile out WriteMode $ \out -> 
        B.hPutStr out (B.unlines final)
    putStrLn "Completed successfully"

問題は、次のように出力されることです。

file1row1
    file2row1
file1row2
    file2row2
file1row3
    file2row3

それ以外の:

file1row1    file2row1
file1row2    file2row2
file1row3    file2row3

ghci で関数を手動で定義してテストすると、同じロジックが正しく機能します。Data.Text.Lazyまた、 lazy の代わりに使用すると、同じコードが正しく機能しBytestringます。

私のアプローチの何が問題になっていますか?

4

2 に答える 2

2

サンプル文字列で Data.ByteString.Lazy.UTF8.lines をテストしたところ、「\r」が削除されませんでした....

ghci -XOverloadedStrings

> import Data.ByteString.Lazy.UTF8 as B

> B.lines "ab\n\rcd"
  ["ab","\rcd"]

> B.lines "ab\r\ncd"
  ["ab\r","cd"]

これはあなたの問題だと思います。

(確認するには、「xxd」またはその他の16進エディタを使用して出力を確認できます....余分な文字が実際に「\ r」であるかどうかを確認してください)。

于 2014-03-04T01:24:48.923 に答える
2

Data.ByteString.Lazy.UTF8 には既知のバグがあり、改行変換が適切に行われないという既知のバグがあります。( Windows での Data.ByteString.Lazy.Char8 改行変換を参照してください --- ドキュメントは誤解を招くものですか? ) これが問題の原因である可能性があります。

于 2014-03-04T04:05:18.890 に答える