将文件解析为嵌套字典

时间:2017-07-23 01:45:55

标签: elixir

我有一个配置文件,我想用以下格式阅读

C:\Users\bscis\AppData\Local\Android\sdk\platform-tools
(Where you located sdk folder)

C:\Users\bscis\AppData\Local\Android\sdk\platform-tools>adb shell
generic_x86:/ $

C:\Users\bscis\AppData\Local\Android\sdk\platform-tools>adb kill-server
C:\Users\bscis\AppData\Local\Android\sdk\platform-tools>adb start-server
* daemon not running. starting it now at tcp:5037 *
* daemon started successfully *

C:\Users\bscis\AppData\Local\Android\sdk\platform-tools>adb root

C:\Users\bscis\AppData\Local\Android\sdk\platform-tools>

然后将其映射到嵌套的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

我无法用Elixir和函数式编程来概念化如何做到这一点。我已经尝试过使用Stream库来实现这一点,但没有运气。

1 个答案:

答案 0 :(得分: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

在将命令式循环转换为函数式时,您最常使用reduce。下一步是确定每次迭代期间所需的所有状态 - 在这种情况下,我们需要&#34;到目前为止的结果&#34;和当前的顶级密钥 - 这类似于你在命令式解决方案中用作循环之外的可变变量。