我有一个包含[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}]
我很难转换这样的内容。
答案 0 :(得分:5)
对于您的特定用例,即使文件扩展名不是.csv
,CSV解析器也可以满足您的需求。
如果您只是想将一个列表用作其他列表的键,则可以将Enum.zip/2
与Map.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},
...]