Data structures 如何在Erlang中将文本文件读入地图?

Data structures 如何在Erlang中将文本文件读入地图?,data-structures,erlang,Data Structures,Erlang,我有一个这样的文本文件: {fruit, [apple,banana,kiwi]}. {car, [estate,hatchback]}. {tree, [ebony,pine,ask,birch]}. {planet, [earth]}. 如何将其读入地图或Erlang中的任何其他数据结构(进一步迭代每个键及其各自的值)并最终打印地图?这一个适合我 -module(test). -export([start/0, scan_string/1]). start() -> {

我有一个这样的文本文件:

{fruit, [apple,banana,kiwi]}.
{car, [estate,hatchback]}.
{tree, [ebony,pine,ask,birch]}.
{planet, [earth]}.

如何将其读入地图或Erlang中的任何其他数据结构(进一步迭代每个键及其各自的值)并最终打印地图?

这一个适合我

-module(test). 
-export([start/0, scan_string/1]). 

start() -> 
   {ok, File} = file:open("Newfile.txt",[read]),
   {ok, List} = file:read(File,1024 * 1024),
   KeyVal = scan_string(List),

   F = fun({K,V}, Acc) -> maps:put(K, V, Acc) end,
   lists:foldl(F, #{}, KeyVal).

scan_string(TermString) ->
    {_, Strings} = lists:foldl(fun break_terms/2, {"", []}, TermString),
    Tokens = [T || {ok, T, _} <- lists:map(fun erl_scan:string/1, Strings)],
    AbsForms = [A || {ok, A} <- lists:map(fun erl_parse:parse_exprs/1, Tokens)],
    [V || {value, V, _} <- lists:map(fun eval_terms/1, AbsForms)].

break_terms($., {String, Lines}) ->
    Line = lists:reverse([$. | String]),
    {"", [Line | Lines]};
break_terms(Char, {String, Lines}) ->
    {[Char | String], Lines}.

eval_terms(Abstract) ->
    erl_eval:exprs(Abstract, erl_eval:new_bindings()).
外壳=

Eshell V9.3.1  (abort with ^G)
1> c(test).
{ok,test}
2> test:start().
#{car => [estate,hatchback],
  fruit => [apple,banana,kiwi],
  tree => [ebony,pine,ask,birch]}
3> 

这个对我来说很有用

-module(test). 
-export([start/0, scan_string/1]). 

start() -> 
   {ok, File} = file:open("Newfile.txt",[read]),
   {ok, List} = file:read(File,1024 * 1024),
   KeyVal = scan_string(List),

   F = fun({K,V}, Acc) -> maps:put(K, V, Acc) end,
   lists:foldl(F, #{}, KeyVal).

scan_string(TermString) ->
    {_, Strings} = lists:foldl(fun break_terms/2, {"", []}, TermString),
    Tokens = [T || {ok, T, _} <- lists:map(fun erl_scan:string/1, Strings)],
    AbsForms = [A || {ok, A} <- lists:map(fun erl_parse:parse_exprs/1, Tokens)],
    [V || {value, V, _} <- lists:map(fun eval_terms/1, AbsForms)].

break_terms($., {String, Lines}) ->
    Line = lists:reverse([$. | String]),
    {"", [Line | Lines]};
break_terms(Char, {String, Lines}) ->
    {[Char | String], Lines}.

eval_terms(Abstract) ->
    erl_eval:exprs(Abstract, erl_eval:new_bindings()).
外壳=

Eshell V9.3.1  (abort with ^G)
1> c(test).
{ok,test}
2> test:start().
#{car => [estate,hatchback],
  fruit => [apple,banana,kiwi],
  tree => [ebony,pine,ask,birch]}
3> 

谢谢,这在shell上有效,但是我如何才能将映射分配给一个变量来迭代它呢?@smaug
map=maps:from_list(L)。
我就是这么做的,但是shell上显示错误:右侧不匹配value@smaug您可能已经将一些值绑定到
映射
。请先执行
f(Map)
或使用其他变量名。@Hynek Pichi Vychodil谢谢,这解决了问题。这些是我刚接触Erlang时面临的最初障碍——官方文档也不是很清晰——至少从初学者的角度来看是这样。谢谢,这在shell上是有效的,但是我如何才能将映射分配给一个变量来迭代它呢?@smaug
map=maps:from_list(L)。
我就是这么做的,但它在外壳上写着一个错误:右边不匹配value@smaug您可能已经将一些值绑定到
映射
。请先执行
f(Map)
或使用其他变量名。@Hynek Pichi Vychodil谢谢,这解决了问题。这些是我作为Erlang新手面临的最初障碍——官方文档也不是很清晰——至少从初学者的角度来看是这样。