преобразовать строку в карту в эликсире - PullRequest
0 голосов
/ 08 марта 2019

У меня есть строка примерно такая:

 ### image_date: 23/01/2019 ### 
    pool2 wxcs 2211
    pool3 wacs 1231
 ### line_count: 1 ###

Я хочу преобразовать это в карту, что-то вроде:

%{
  image_data: "23/01/2019",
  content: "pool2 wxcs 2211\npool3 wacs 1231",
  line_count: 1
}

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Можно использовать Regex.scan/3:

for [capture] <- Regex.scan(~r/(?<=###).*?(?=###)/mus, str), into: %{} do
  case capture |> String.split(":") |> Enum.map(&String.trim/1) do
    [name, value] -> {name, value}
    [content] -> {"content", content}
  end
end

в результате:

#⇒ %{
#  "content" => "pool2 wxcs 2211\n    pool3 wacs 1231",
#  "image_date" => "23/01/2019",
#  "line_count" => "1"
# }
0 голосов
/ 08 марта 2019

Это не красиво, но делает работу.

defmodule UglyParser do
  def main do
    str = """
    ### image_date: 23/01/2019 ###
        pool2 wxcs 2211
        pool3 wacs 1231
    ### line_count: 1 ###
    """

    [header, content, footer] = String.split(str, ~r/(?:#\s*\n)|(?:\n\s*#)/, trim: true)

    header = to_pair(header)
    footer = to_pair(footer)
    content = {:content, String.trim(content) |> String.replace(~r/\n\s*/, "\n")}

    Enum.into([header, footer, content], %{})
  end

  defp to_pair(str) do
    String.replace(str, "#", "")
    |> String.trim()
    |> String.split(": ")
    |> (fn [key, value] -> {String.to_atom(key), value} end).()
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...