【问题标题】:Building list of tuples from list in Erlang从 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 会更有效,但如果不知道您实际阅读的内容,就无法提出解决方案。

标签: list erlang pattern-matching


【解决方案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">>}]

【讨论】:

  • 哈哈哈,我使用的标记分隔符使用的是正斜杠而不是反斜杠,它现在可以按我的意愿工作!
猜你喜欢
  • 2014-06-30
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-17
  • 2020-10-04
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多