Phoenix/Elixir从CSV初始化数据库出现FunctionClauseError如何修复
问题修复方案
错误原因
CSV.decode处理CSV行数据时,会返回两种格式的结果:成功时返回{:ok, map},行格式不符合预期时返回{:error, 错误信息}。你当前代码的匿名函数仅匹配了成功场景的返回值,遇到错误行时没有对应的函数子句处理,因此触发FunctionClauseError。
修复方法
修改Enum.each的匿名函数,增加错误分支的匹配逻辑,你可以根据自身需求选择打印错误后跳过异常行,或者终止执行定位问题。建议同时增加行号打印,方便快速定位CSV中存在问题的行。
修复后完整代码(带错误行定位)
alias FlightsList.Repo alias FlightsList.Management.Flights File.stream!("C:/Users/vukap/phx_projects/flights_list/priv/repo/flights.csv") |> Stream.drop(1) |> CSV.decode(headers: [:Id, :Origin, :Destination, :DepartureDate, :DepartureTime, :ArrivalDate, :ArrivalTime, :Number]) |> Stream.with_index(2) # 已跳过表头,行号从第2行开始计数 |> Enum.each(fn {{:ok, map}, _line_num} -> Flights.changeset( %Flights{}, %{Id: String.to_integer(map[:Id]), Origin: map[:Origin], Destination: map[:Destination], DepartureDate: String.to_integer(map[:DepartureDate]), DepartureTime: String.to_integer(map[:DepartureTime]), ArrivalDate: String.to_integer(map[:ArrivalDate]), ArrivalTime: String.to_integer(map[:ArrivalTime]), Number: map[:Number]}) |> Repo.insert!() {{:error, reason}, line_num} -> IO.puts("处理CSV第#{line_num}行失败: #{inspect(reason)}") # 如果需要遇到错误直接终止执行,取消下面这行注释即可 # raise "CSV行格式错误" end)
内容的提问来源于stack exchange,提问作者andriyenkoa
相关产品推荐
相关产品推荐

