从 Erlang 的列表中构建元组列表
Posted
技术标签:
【中文标题】从 Erlang 的列表中构建元组列表【英文标题】:Building list of tuples from list in Erlang 【发布时间】:2016-07-12 06:38:52 【问题描述】:我正在尝试从文件中读取内容,然后将其组织成一个元组列表。我已将文件读入数字列表,但是它似乎在换行符后立即跳过数字,如何防止这种行为? 我保证是偶数个字符的文件。
-module(brcp).
-export([parse_file/1]).
parse_file(Filename) ->
read_file(Filename).
read_file(Filename) ->
ok, File = file:read_file(Filename),
Content = unicode:characters_to_list(File),
build_tuples([begin Int,_=string:to_integer(Token), Int end|| Token<-string:tokens(Content," /n/r")]).
build_tuples(List) ->
case List of
[] -> [];
[E1,E2|Rest] -> [E1,E2] ++ build_tuples(Rest)
end.
这是一个示例输入文件:
1 7 11 0
1 3 5 0 7 0
1 8 10 0 1 11
99 0
【问题讨论】:
我认为“列表推导”是一个很好的开始,尽管您只有一个列表可以开始并且您需要一个元组列表。同时,我坚信它是“元组”而不是“元组” 谢谢 :) 我单独读取并加载了数字,但是如果我遇到换行符,它会跳过紧随其后的数字 D: 你能添加一个输入数据的例子吗?我相信在这里使用erlang.org/doc/man/binary.html#split-2 会更有效,但如果不知道您实际阅读的内容,就无法提出解决方案。 【参考方案1】:-module(tuples).
-export([parse/0]).
parse() ->
ok, File = file:read_file("tuples.txt"),
List = binary:split(File, [<<" ">>, <<"\t">>, <<"\n">>], [global, trim_all]),
io:format("~p~n", [List]),
build_tuples(List, []).
build_tuples([X,Y|T], Acc) ->
build_tuples(T, [X,Y|Acc]);
build_tuples([X|T], Acc) ->
build_tuples(T, [X, undefined|Acc]);
build_tuples([], Acc) ->
lists:reverse(Acc).
我使用的文本文件几乎和你的一样,但我添加了制表符和多个空格以使其更真实:
1 7 11 0
1 3 5 0 7 0
1 8 10 0 1 11
99 0
您当然可以在使用erlang:binary_to_integer/1
将二进制文件添加到元组时将它们转换为整数。代码中使用的binary:split/3
函数将所有空字符(制表符、空格、换行符)解析为空二进制文件,然后trim_all
忽略它们。如果您的输入总是格式正确,您可以跳过它们。结果:
14> tuples:parse().
[<<"1">>,<<"7">>,<<"11">>,<<"0">>,<<"1">>,<<"3">>,<<"5">>,<<"0">>,<<"7">>,<<"0">>,<<"1">>,<<"8">>,<<"10">>,<<"0">>,<<"1">>,<<"11">>,<<"99">>,<<"0">>]
[<<"1">>,<<"7">>,<<"11">>,<<"0">>,<<"1">>,<<"3">>,<<"5">>,<<"0">>,<<"7">>,<<"0">>,<<"1">>,<<"8">>,<<"10">>,<<"0">>,<<"1">>,<<"11">>,<<"99">>,<<"0">>]
【讨论】:
哈哈哈,我使用的标记分隔符使用的是正斜杠而不是反斜杠,它现在可以按我的意愿工作!以上是关于从 Erlang 的列表中构建元组列表的主要内容,如果未能解决你的问题,请参考以下文章