我正在编写一个程序,它将文本文件列表作为参数,并输出一个文件,其中每一行都是文件中相应行之间的选项卡插入。
假设所有字符都是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
时,相同的代码可以正常工作。
我的方法出了什么问题?
答案 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?)这可能是导致问题的原因。