Elixir 将文件解析为嵌套字典
我有一个配置文件,我想用以下格式读取Elixir 将文件解析为嵌套字典,elixir,Elixir,我有一个配置文件,我想用以下格式读取 [key_1] inner_key_1 inner_entry_1 inner_key_2 inner_entry_2 inner_key_3 inner_entry_3 inner_key_4 inner_entry_4 [key_2] inner_key_5 inner_entry_5 inner_key_6 inner_entry_6 inner_key_7 inner_entry_7 inner_key_8 inner_entry_8 然后会被映射
[key_1]
inner_key_1 inner_entry_1
inner_key_2 inner_entry_2
inner_key_3 inner_entry_3
inner_key_4 inner_entry_4
[key_2]
inner_key_5 inner_entry_5
inner_key_6 inner_entry_6
inner_key_7 inner_entry_7
inner_key_8 inner_entry_8
然后会被映射到一个嵌套的长生不老药字典中,就像这样
%{key_1 => %{inner_key_1 => inner_entry_1, ... }, key_2 => %{inner_key_5 => inner_entry_5,...}}
我在构思如何使用长生不老药和函数式编程时遇到困难。我曾尝试使用流库来实现这一点,但没有成功。一个简单的解决方案可能与此类似:
def read_config(file) do
file
|> File.stream!()
|> Stream.map(&String.trim/1)
|> Enum.reduce({%{}, nil}, &read_config/2)
|> elem(0)
end
defp read_config("[" <> key, {acc, _top_key}) do
key = String.trim_trailing(key, "]")
{Map.put(acc, key, %{}), key}
end
defp read_config(key_value, {acc, top_key}) do
[key, value] = String.split(key_value, " ")
{put_in(acc, [top_key, key], value), top_key}
end
def read_config(文件)do
文件
|>File.stream!()
|>Stream.map(&String.trim/1)
|>reduce({%{},nil},&read_config/2)
|>元素(0)
结束
defp read_config(“[”键,{acc,{U top_键})do
key=String.trim_尾部(key,“]”)
{Map.put(acc,key,%{}),key}
结束
defp read_config(key_value,{acc,top_key})do
[key,value]=String.split(key_value,“”)
{put_in(acc,[top_key,key],value),top_key}
结束
在将命令式循环转换为函数式样式时,最常用的是reduce。下一步是确定每个迭代过程中需要的所有状态-在本例中,我们需要“到目前为止的结果”和当前的顶级键-这类似于您在命令式解决方案中作为循环外的可变变量使用的状态。为什么不允许使用类似
“[“key”]”
,禁止这样使用
运算符的原因是什么。只有二进制匹配的最后一部分可以忽略大小<代码>“foo”条的语法与
相同,因此此限制也适用于此处。在某种程度上,这只是当前实现的一个限制,可以通过Erlang本身的一些工作来解除。