Hi, I am parsing data from a csv. Everything is going pretty well except for the fact that my csv has a column for each state associated with a sales territory. It is set up this way so a group of states can all be in the same row as the territory id. Here is my function:
def parse_data(csv_object) do
csv_object
|> Enum.map( fn x -> x["territory_id"] end)
|> Enum.uniq()
|> Enum.map(fn territory_id ->
csv_object
|> Enum.filter(fn x -> x["territory_id"] == territory_id end)
|> Enum.reduce(%{territory_id: territory_id ,ownerids: [] ,name: nil, sub_vertical: nil, states: [], number_rows_to_get: nil}, fn row, acc ->
acc
|> Map.put(:ownerids, acc.ownerids++ [row["ownerid"]])
|> Map.put(:territory_name, row["territory_name"])
|> Map.put(:sub_vertical_name, row["sub_vertical_id"])
|> Map.put(:number_rows_to_get, row["number_rows_to_get"])
|> Map.put(:states, acc.states++ [row["state_1"]])
|> Map.concat(:states, acc.states++ [row["state_2"]])
|> Map.put(:states, acc.states++ [row["state_3"]])
|> Map.put(:states, acc.states++ [row["state_4"]])
|> Map.put(:states, acc.states++ [row["state_5"]])
|> Map.put(:states, acc.states++ [row["state_6"]])
|> Map.put(:states, acc.states++ [row["state_7"]])
|> Map.put(:states, acc.states++ [row["state_8"]])
|> Map.put(:states, acc.states++ [row["state_9"]])
|> Map.put(:states, acc.states++ [row["state_10"]])
|> Map.put(:states, acc.states++ [row["state_11"]])
|> Map.put(:states, acc.states++ [row["state_12"]])
|> Map.put(:states, acc.states++ [row["state_13"]])
|> Map.put(:states, acc.states++ [row["state_14"]])
|> Map.put(:states, acc.states++ [row["state_15"]])
|> Map.put(:states, acc.states++ [row["state_16"]])
|> Map.put(:states, acc.states++ [row["state_17"]])
|> Map.put(:states, acc.states++ [row["state_18"]])
|> Map.put(:states, acc.states++ [row["state_19"]])
|> Map.put(:states, acc.states++ [row["state_20"]])
|> Map.put(:states, acc.states++ [row["state_21"]])
|> Map.put(:states, acc.states++ [row["state_22"]])
|> Map.put(:states, acc.states++ [row["state_23"]])
|> Map.put(:states, acc.states++ [row["state_24"]])
|> Map.put(:states, acc.states++ [row["state_25"]])
|> Map.put(:states, acc.states++ [row["state_26"]])
|> Map.put(:states, acc.states++ [row["state_27"]])
|> Map.put(:states, acc.states++ [row["state_28"]])
|> Map.put(:states, acc.states++ [row["state_29"]])
end)
end)
end
Obviously the problem is that each iteration of Map.put
overwrites the previous one. Being that I am needing to append values to a specific key in a map at each new step of the pipeline I am not sure how to achieve this. I thought I could use Enum.concat but that seems to only work when appending one enumerable to another and has no option for specifying a certain key to continually append to. Any help appreciated.
example of csv before being input:
example of desired output:
%{
territory_id: "24",
territory_name: "west_exteriors",
rep_name: "Coleman Baker"
ownerids: ["0051P000003BJ5t"]
states: ["Alaska", "British Columbia", "Alberta"],
sub_vertical_name: "Exteriors"
},
...
]
So basically I want to be able to append the state in column `state_1` to a list inside the map then append the state in column `state_2` to the same list etc. Hope that gives more context. Thanks!