defmodule Tesourex.CSV do import Tesourex.Helper def parse(tesouro_csv) do tesouro_csv |> String.splitter("\n") |> Stream.filter(&(String.starts_with?(&1, "Tesouro"))) |> Stream.map(&parse_line/1) |> Enum.reduce(%{}, &group_by_name_and_most_recent/2) end defp group_by_name_and_most_recent(row, acc) do Map.update(acc, row[:name], row, &(most_recent(&1, row))) end defp parse_line(line) do line |> String.trim() |> String.split(";") |> parts_to_map end defp parts_to_map([name,mature_at,last_updated_at,buy_rate,sell_rate,buy_price,sell_price,_]) do %{ name: name_with_year(name, mature_at), mature_at: mature_at, last_updated_at: last_updated_at, buy_rate: parse_value(buy_rate), buy_price: parse_value(buy_price), sell_rate: parse_value(sell_rate), sell_price: parse_value(sell_price) } end defp name_with_year(name, date) do year = date |> String.split("/") |> Enum.at(2) "#{name} #{year}" end end