首页 > 解决方案 > 在使用 Ruby 编码倒带文件后,第 1 行中的非法引用 (CSV::MalformedCSVError)

问题描述

当我从指定正确编码的有效 CSV 文件中读取数据并使用倒带功能时,读取失败(产生以下错误)。相同的文件无需倒带即可正常工作。

这只发生在使用 CSV.new() 和指定编码的 File.new() 时。从字符串对象或未指定(需要)编码的文件中使用 CSV.read() 或 CSV.new() 时不会发生这种情况。似乎在 CSV.rewind(调用 IO.rewind)期间文件编码信息丢失了。这是一个错误还是我做错了?我通过使用 CSV.read 避免了这个问题,但是整个文件都进入了内存,我不希望这样。

测试.rb:

require 'csv'
csvdata = CSV.new(
  File.new('test.csv', 'rb:BOM|UTF-8'),
  :col_sep => ';', 
  :quote_char => '"',
  :headers => true)
csvdata.rewind
csvdata.each do |r| 
  puts r.inspect
end

测试.csv:

"Col 1";"Col 2";"Col 3"
"ROW1";"";""
"ROW2";"";""
"ROW3";"";""

没有倒带,一切顺利。使用倒带,出现以下错误:

Traceback (most recent call last):
    9: from test.rb:9:in `<main>'
    8: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv.rb:1236:in `each'
    7: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv.rb:1236:in `each'
    6: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:303:in `parse'
    5: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:779:in `parse_quotable_loose'
    4: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:28:in `each_line'
    3: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:28:in `each_line'
    2: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:31:in `block in each_line'
    1: from ~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:818:in `block in parse_quotable_loose'
~/.rbenv/versions/2.6.3/lib/ruby/2.6.0/csv/parser.rb:879:in `parse_quotable_robust': Illegal quoting in line 1. (CSV::MalformedCSVError)

ruby 2.6.3p62(2019-04-16 修订版 67580)[x86_64-darwin18]

标签: rubycsv

解决方案


推荐阅读