Please I have a list of fields and a corresponding data-table.
I have been trying (unsuccessfully) to convert / zip them into the required map format below:
Any help would be appreciated please.
flds = ["field-1", "field-2", "field-3"]
data_table =
[
["10100", "aaa", 3.0, 2.0], ["10100", "bbb", 5.0, 5.0], ["10100", "ccc", 2.0, 1.0],
["20100", "ddd", 3.0, 2.0],
["30100", "rrr", 3.0, 2.0], ["30100", "www", 2.0, 1.0]
]
output_map =
%{
"10100" =>
%{{1, "field-1"} => "aaa", {1, "field-2"} => 3.00, {1, "field-3"} => 2.00,
{2, "field-1"} => "bbb", {2, "field-2"} => 5.00, {2, "field-3"} => 5.00,
{3, "field-1"} => "ccc", {3, "field-2"} => 2.00, {3, "field-3"} => 1.00},
"20100" =>
%{{1, "field-1"} => "ddd", {1, "field-2"} => 3.00, {1, "field-3"} => 2.00},
"30100" =>
%{{1, "field-1"} => "rrr", {1, "field-2"} => 3.00, {1, "field-3"} => 2.00,
{2, "field-1"} => "www", {2, "field-2"} => 2.00, {2, "field-3"} => 1.00}
}
I am able to handle the simpler case where the fields match the data-table directly:
flds = ["field-1", "field-2", "field-3"]
input_data2 =
[
["aaa", 3.00, 2.00], ["bbb", 5.00, 5.00], ["ccc", 2.00, 1.00]
]
expected_map =
%{ {1, "field-1"} => "aaa", {1, "field-2"} => 3.0, {1, "field-3"} => 2.0,
{2, "field-1"} => "bbb", {2, "field-2"} => 5.0, {2, "field-3"} => 5.0,
{3, "field-1"} => "ccc", {3, "field-2"} => 2.0, {3, "field-3"} => 1.0}
with this code:
defp combine(arr), do: (for {l, r} <- arr, {f, v} <- l, into: %{}, do: {{r,f}, v})
input_data2
|> Stream.map(&Stream.zip(flds, &1))
|> Stream.with_index(1)
|> combine()