defmodule Mix.Tasks.Analytics3i.Top do use Mix.Task require Logger @shortdoc "Top" def run(_) do {:ok, _} = Application.ensure_all_started(:analytics_3i) Logger.add_backend {LoggerFileBackend, :debug} Logger.configure_backend {LoggerFileBackend, :debug}, path: Path.expand("../../../log/debug.log", __DIR__), format: "$time $metadata[$level] $message\n" otrasl_list = load_yaml("data/otrasl.yml") st_list = load_yaml("data/st.yml") result = Path.wildcard("output/*.csv") |> Enum.reduce([], fn (file_name, acc) -> {otrasl, st} = otrasl_st(file_name) list = File.stream!(file_name) |> Stream.take(11) |> CSV.decode!(headers: true) |> Enum.to_list() |> Enum.map(fn m -> Map.merge(%{otrasl: otrasl_list[otrasl]["name"], tech: st_list[st]["name"]}, m) end) acc ++ list end) write_csv!(Map.keys(List.first(result)), result) end defp otrasl_st(file_name) do info = String.split(Path.basename(file_name), ~r{[_.]}) otrasl_name_size = Enum.count(info) - 3 otrasl_name_size = if Enum.at(info, otrasl_name_size) == "new", do: otrasl_name_size - 1, else: otrasl_name_size otrasl_name = (1..otrasl_name_size) |> Enum.map(fn x -> Enum.at(info, x) end) |> Enum.join("_") st_name_size = Enum.count(info) - otrasl_name_size - 2 st_name = (otrasl_name_size + 1..otrasl_name_size + st_name_size) |> Enum.map(fn x -> Enum.at(info, x) end) |> Enum.join("_") {otrasl_name, st_name} end defp load_yaml(path) do path = File.cwd! |> Path.join(path) {:ok, data} = YamlElixir.read_from_file path data end defp write_csv!(keys, values) do File.open("data/top_ten.csv", [:write, :utf8], fn(file) -> values |> CSV.encode(headers: keys) |> Enum.each(&IO.write(file, &1)) end) end end