ruby - 在使用 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]
解决方案
推荐阅读
- sql - 使用列表作为 sql 参数的 .NET 查询
- swift - 如何在 Swift 子类的初始化程序中调用静态属性?
- sql - SQL Server - 如何将 varchar 转换为日期
- reactjs - 如何允许连接根据状态更改重新渲染对象
- android - 如何使用 dagger 2 创建 ViewModel 并向其注入存储库?
- android - onClick xml 在 kotlin 中不起作用
- jquery - 为什么不推荐使用 Jquery DataTable?
- jquery - 如何在 jquery 中将 .resize 函数添加到相同的 .scroll 函数
- scheduling - 在开发排课系统时,是否可以只使用遗传算法的表示方法/染色体?
- wordpress - Wordpress - 仅迁移帖子和图像