defmodule Mix.Tasks.Analytics3i.Count do use Mix.Task require Logger @shortdoc "Count" 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(%{dataProvider: %{}}, fn (file_name, acc) -> {otrasl, st} = otrasl_st(file_name) count = File.stream!(file_name) |> Stream.with_index |> Enum.count() otrasl_data = Map.get(acc[:dataProvider], otrasl, %{name: otrasl_list[otrasl]["name"], data: %{}}) otrasl_data = Map.put(otrasl_data, :data, Map.put(otrasl_data[:data], st, count - 1)) Map.put(acc, :dataProvider, Map.put(acc[:dataProvider], otrasl, otrasl_data)) end) dataValues = result[:dataProvider] |> Enum.map(fn {_, value} -> result = value[:data] |> Enum.reduce(%{}, fn ({k, v}, acc) -> Map.put(acc, st_list[k]["name"], v) end) total = result |> Enum.reduce(0, fn {_, v}, acc -> acc + v end) result |> Map.put(:Label, value[:name]) |> Map.put(:Total, total) end) write_csv!(Map.keys(List.first(dataValues)), dataValues) 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/graph_dots_total.csv", [:write, :utf8], fn(file) -> values |> CSV.encode(headers: keys) |> Enum.each(&IO.write(file, &1)) end) end end