-1

我已经阅读了一个多行文件并将其转换为具有以下代码的列表:

Lines = string:tokens(erlang:binary_to_list(Binary), "\n"),

我将其转换为字符串以对其进行一些处理:

Flat = string:join(Lines, "\r\n"),

我完成了对字符串的处理,现在我需要将其转换回多行列表,我尝试重复上面显示的第一个片段但从未奏效,我尝试了 string:join 并且没有奏效..我如何将它转换回来到一个像以前一样的列表(虽然现在修改了)?

4

3 回答 3

1

上面的第一个片段包含一个调用erlang:binary_to_list/1,首先将二进制文件转换为字符串(列表),然后将其与调用拆分string:tokens/2,然后与string:join/2. 正如您所写的那样,执行tokensthen的结果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"]

请注意,每个“字符串”本身就是一个字符列表。之后你打算用它做什么?

于 2013-01-24T15:06:39.623 回答
1

这取决于您对扁平字符串所做的修改。 string:tokens/2将始终使用您提供的分隔符来分解字符串。因此,只要您的转换保留特定字符串作为各个子字符串之间的分隔符,就应该没有问题。

但是,如果您在转换中做一些更复杂和破坏性的事情,那么唯一的方法是手动迭代字符串并构造各个子字符串。

于 2013-01-24T13:24:29.810 回答
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”,“is”,“a”,“string”]),除了string:join,它需要一个列表扁弦。

于 2013-01-24T15:59:30.650 回答