Elixir使用NimbleCSV解析CSV遇问题:初始报错后输出空列表
解决NimbleCSV解析报错与输出空列表问题
原解析报错原因
你之前遇到的(NimbleCSV.ParseError) unexpected escape character "错误,根源是CSV格式与解析配置不匹配:
- 你自定义了分隔符为
|、转义符为"的MyParser,但实际使用的是默认遵循RFC4180标准(逗号分隔、双引号转义)的NimbleCSV.RFC4180.parse_stream() - 同时原始CSV格式混乱,比如
01|Data1","02|Data2","01|Data3混合了引号和错误的分隔符,尝试的"01|Data1","02|Data2","01|Data3"则是逗号分隔的格式,和你定义的|分隔符冲突。
当前空列表问题的解决
现在CSV内容格式正确(每行用|分隔两个字段),但输出空列表是代码存在两处错误:
- 未使用自定义的解析器:你定义了
MyParser却依然调用NimbleCSV.RFC4180.parse_stream(),而RFC4180默认用逗号作为分隔符,自然解析不出|分隔的内容。 - 函数语法错误:
Stream.map中的匿名函数定义不完整,fn [code, data] -缺少了>,应为fn [code, data] ->。
修正后的代码
NimbleCSV.define(MyParser, separator: "|", escape: "\"") File.stream!("data.csv") |> MyParser.parse_stream() |> Stream.map(fn [code, data] -> %{code: code, data: data} end) |> Enum.to_list() |> IO.inspect()
验证结果
使用你当前的CSV内容:
01|Data1 02|Data2 01|Data3
运行修正后的代码,会输出正确的列表:
[%{code: "01", data: "Data1"}, %{code: "02", data: "Data2"}, %{code: "01", data: "Data3"}]
内容的提问来源于stack exchange,提问作者C0ol_Cod3r
相关产品推荐
相关产品推荐

