我们如何将列表列表转换为地图? (长生不老药)

时间:2019-10-15 15:12:24

标签: data-structures elixir

我有一个包含[A,B,C,D,E]的列表,而A具有一个值[1、2、3、4、5]的列表,类似地,B具有一个值[1、2、2]的列表,3,4,5]

Date,SKU,Unit Price,Quantity,Total Price
2019-01-01,Death by Chocolate,180,5,900
2019-01-01,Cake Fudge,150,1,150
2019-01-01,Cake Fudge,150,1,150
2019-01-01,Cake Fudge,150,3,450
2019-01-01,Death by Chocolate,180,1,180
2019-01-01,Vanilla Double Scoop,80,3,240
2019-01-01,Butterscotch Single Scoop,60,5,300
2019-01-01,Vanilla Single Scoop,50,5,250
2019-01-01,Cake Fudge,150,5,750

类似这样的事情,但是我想要的是创建一个标题等于其对应值的地图。

预期输出看起来像这样:-

[%{date: '2019-01-01',SKU: 'Death by Chocolate', price: 50, quantity: 3},
    %{date: '2019-01-01',SKU: 'Cake Fudge', price: 150, quantity: 3}]

我很难转换这样的内容。

1 个答案:

答案 0 :(得分:5)

对于您的特定用例,即使文件扩展名不是.csv,CSV解析器也可以满足您的需求。

如果您只是想将一个列表用作其他列表的键,则可以将Enum.zip/2Map.new/1结合使用,以将标题列表与行列表一起压缩并创建地图(取决于文件您可能要使用流而不是列表的大小)。

iex> [headers | rows] = do_some_parsing(text)
iex> headers
["Date", "SKU", "Unit Price", "Quantity", "Total Price"]
iex> rows
[["2019-01-01", "Death by Chocolate", 180, 5, 900],
 ["2019-01-01", "Cake Fudge", 150, 1, 150],
 ...]
iex> Enum.map(rows, fn row -> headers |> Enum.zip(row) |> Map.new() end)
[%{"Date" => "2019-01-01", "SKU" => "Death by Chocolate", "Unit Price" => 180, "Quantity" => 5, "Total Price" => 900},
 %{"Date" => "2019-01-01", "SKU" => "Cake Fudge", "Unit Price" => 150, "Quantity" => 1, "Total Price" => 150},
 ...]