Packages

Environment configuration parser. Purely functional, server free.

Current section

Files

Jump to
analytics_3i lib mix tasks count.ex
Raw

lib/mix/tasks/count.ex

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