[英]How to import from csv file with elixir/phoenix?
我有一个CSV文件要在Elixir中处理,并在我的存储库中填充一些数据。 我关注了如何使用elixir / phoenix从csv文件导入用户? 但我的需求略有不同;
我正在尝试使用CSV模块中的headers:true方法,但无法弄清楚如何使用它或检查其答案的内容(Elixir对我来说还不如ruby;)
有什么建议吗?
文件已处理(我收到了闪存消息)
def import(conn, %{"item" => item_params}) do
item_params["file"].path
|> File.stream!()
|> CSV.decode(separator: ?;, headers: true) #headers: [:level, :DIM0, :DIM1, :DIM2, :DIM3, :DIM4]
|> Enum.map(fn (item) ->
Item.changeset(%Item{}, %{level: Enum.at(item, 0), dim0: Enum.at(item, 1), dim1: Enum.at(item, 2), dim2: Enum.at(item, 3), dim3: Enum.at(item, 4), dim4: Enum.at(item, 5)})
#|> (fn(item) -> Logger.info "Csv content : #{inspect item}" end).()
|> Repo.insert
end)
|> Enum.filter(fn
{:error, _} -> true
_ -> false
end)
|> case do
[] ->
conn
|> put_flash(:info, "Imported without error")
|> redirect(to: item_path(conn, :index))
errors ->
#errors = parse_errors(errors) # create this fun
conn
|> put_flash(:error, errors)
|> render("import.html")
end
end
对于任何人的需求,这是我的代码:
item_params["file"].path
|> File.stream!()
|> CSV.decode(separator: ?;, headers: [:level, :dim0, :dim1, :dim2, :dim3, :dim4])
|> Enum.map(fn (item) ->
{:ok, fields} = item
Item.changeset(%Item{}, %{topic_id: item_params["topic_id"], level: fields.level, dim0: fields.dim0, dim1: fields.dim1, dim2: fields.dim2, dim3: fields.dim3, dim4: fields.dim4})
|> Repo.insert
end)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.