从 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 的列表中构建元组列表的主要内容,如果未能解决你的问题,请参考以下文章

Erlang 记录与映射组

尝试在 Erlang 中组合列表的问题

从列表中删除 nil - Erlang

Erlang复合数据结构基础之元组与列表

如何从 Erlang 的列表或字符串中删除字符?

如何从 Erlang 中的对列表中获取元素