在我的程序中,我生成一个数字列表:
data = [2,3,2,5,2,7,2,3,2,11 ... ]
现在我想将这个数字列表写成文件中单行逗号分隔的字符串。我知道我可以将writeFile
与Show
结合使用:
writeFile "data.txt" $ show $ data
但是,这也会在开头和结尾打印方括号。现在,我可以使用Show data
从字符串reverse
中删除第一个和最后一个字符,但效率很低。在某些时候,程序已经遍历列表以便将字符写入文件,那么如何确保它不会在不进行不必要的遍历的情况下写入第一个和最后一个字符?
这会最有效地完成工作吗?
writeFile "data.txt" $ drop 1 $ takeWhile (\c -> c/= ']') $ show data
答案 0 :(得分:3)
你所拥有的是好的,但我认为更简洁的方法是不在列表中使用show
,而是展示每个元素并自己输入逗号,如下所示:
writeFile "data.txt" . intercalate "," . map show $ [1, 2, 3]
intercalate
来自Data.List
。
(顺便说一下:你无法调用变量data
,因为这是一个关键字)
答案 1 :(得分:2)
你有很多方法可以做到这一点!您的数据将转换为字符串,现在您可以使用它们:
在您的情况下,您可以像这样编写代码(列表的每个元素都被读取一次并直接转换)
writeFile "data.txt" $ Data.List.foldl (\x y -> x ++ show y ++ ",") "" data
并且没有最后一个逗号:
writeFile "data.txt" $ Data.List.tail $ Data.List.foldl (\x y -> x ++ "," ++ show y) "" data
或使用Data.List中的intercalate
Data.List.intercalate "," $ Data.List.map (\x -> show x) data
类似的问题在stackoverflow上: