Data.ByteString输出不正确

时间:2014-03-04 00:36:52

标签: haskell text io bytestring

我正在编写一个程序,它将文本文件列表作为参数,并输出一个文件,其中每一行都是文件中相应行之间的选项卡插入。

假设所有字符都是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代替懒惰Bytestring时,相同的代码可以正常工作。

我的方法出了什么问题?

2 个答案:

答案 0 :(得分: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”或任何其他十六进制编辑器查看输出....查看额外字符是否实际上是“\ r”)。

答案 1 :(得分:2)

Data.ByteString.Lazy.UTF8中存在一个已知错误,即换文档无法正确进行换行,即使文档说它应该也是如此。 (见Data.ByteString.Lazy.Char8 newline conversion on Windows---is the documentation misleading?)这可能是导致问题的原因。