我有一个配置文件,我想用以下格式阅读
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库来实现这一点,但没有运气。
答案 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;和当前的顶级密钥 - 这类似于你在命令式解决方案中用作循环之外的可变变量。