Current section
Files
Jump to
Current section
Files
lib/csv.ex
defmodule Tesourex.CSV do
import Tesourex.Helper
def parse(tesouro_csv) do
tesouro_csv
|> String.splitter("\n")
|> Stream.filter_map(&(String.starts_with?(&1, "Tesouro")), &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