Packages

Environment configuration parser. Purely functional, server free.

Current section

Files

Jump to
analytics_3i lib mix tasks top.ex
Raw

lib/mix/tasks/top.ex

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