【问题标题】:How to import from csv file with elixir/phoenix?如何使用 elixir/phoenix 从 csv 文件导入?
【发布时间】:2017-12-16 17:04:27
【问题描述】:

我有一个 CSV 文件要在 Elixir 中处理并在我的仓库中填充一些数据。我关注了How to import users from csv file with elixir/phoenix?,但我的需求略有不同;

我正在尝试使用 headers: true 来自 CSV 模块的方法,但无法弄清楚如何使用它或检查其答案的内容(Elixir 对我来说还不如 ruby​​ 清晰;)

有什么建议吗?

文件已处理(我收到了 Flash 消息)

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

【问题讨论】:

  • 尝试按名称访问项目的列。将Enum.at(item, 0) 更改为item["level"],将Enum.at(item, 1) 更改为item["DIM0"] 等,因为您使用的是headers: true
  • 我试过但没有成功;我还尝试了 IO.inspect() 并得到一个 #Stream, funs: [#Function]]>您对如何打印枚举的内容有任何想法吗?
  • 您在哪里添加了IO.inspect?尝试在Enum.map 函数中添加这个:IO.inspect(item)
  • 找到了! t 是由于 Microsoft excel :-( 失去了 2 天... txs 为您的帮助!对于那些正在寻找解决方案的人,请在网上找到一个不错的 .csv 模板来使用。
  • 我注意到一个工作文件在通过 MS 手后不再工作......

标签: csv elixir phoenix-framework


【解决方案1】:

对于任何人的需要,这是我的代码:

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)

【讨论】:

    猜你喜欢
    • 2017-10-09
    • 2020-04-26
    • 1970-01-01
    • 2023-02-14
    • 2022-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多