我已阅读多行文件,并使用以下代码将其转换为列表:
Lines = string:tokens(erlang:binary_to_list(Binary), "\n"),
我把它转换为字符串来做一些工作:
Flat = string:join(Lines, "\r\n"),
我完成了字符串的工作,现在我需要将其转换回多行列表,我试图重复上面显示的第一个片段,但从未奏效,我尝试了字符串:加入并且没有用...我怎么做将它转换回原来的列表(虽然现在已修改)?
答案 0 :(得分:1)
那取决于您对扁平字符串所做的修改。
string:tokens/2
将始终使用您提供的分隔符分解字符串。因此,只要您的转换将特定字符串保留为各个子字符串之间的分隔符,就应该没有问题。
但是,如果你在转换中做了更精细和破坏性的事情,那么唯一的方法是手动迭代字符串并构造各个子字符串。
答案 1 :(得分:1)
上面的第一个代码段包含对erlang:binary_to_list/1
的调用,该调用首先将二进制文件转换为字符串(列表),然后通过调用string:tokens/2
将其拆分,然后与string:join/2
一起加入。执行tokens
然后join
的结果似乎是将它从包含\n
分隔的行的字符串转换为包含\r\n
分隔的行的字符串。注:这是一个平面的人物清单。
这是你的意图吗?
你现在应该做什么取决于你的意思“我需要将它转换回多线列表”。您是指单个字符列表(字符串)中的所有内容,还是在每行都是字符列表(字符串)的嵌套行列表中。即如果你最终
"here is line 1\r\nhere is line 2\r\nhere is line 3\r\n"
这已经是多行列表了,或者你的意思是
["here is line 1","here is line 2","here is line 3"]
请注意,每个“字符串”本身就是一个字符列表。之后你打算用它做什么?
答案 2 :(得分:1)
你的条款很混乱。任何语言的字符串都是对应于人类可读字符的整数值序列。值的表示是二进制还是列表无关紧要,因为它们包含的数据在技术上都是字符串。
话虽如此,您在第一组指令中将二进制字符串转换为列表字符串。要将列表转换为二进制文件,如果列表不平整,您可以致电erlang:list_to_binary/1
或erlang:iolist_to_binary/1
。例如:
BinString = <<"this\nis\na\nstring">>.
ListString = "this\nis\na\nstring" = binary_to_list(BinString).
Words = ["this", "is", "a", "string"] = string:tokens(ListString, "\n").
<<"thisisastring">> = iolist_to_binary(Words).
Rejoined = "this\r\nis\r\na\r\nstring" = string:join(Words, "\r\n").
BinAgain = <<"this\r\nis\r\na\r\nstring">> = list_to_binary(Rejoined).
供您参考,string
模块 始终 需要一个平面列表(例如,“这是一个字符串”,但不是[“this”, “是”,“a”,“字符串”]),string:join
除外,它采用扁平字符串列表。