CSV – 未加引号的字段不允许\ r或\ n(第2行)
尝试解析CSV文件,但仍然收到错误消息未引用字段不允许\ r或\ n(第2行)。 。
我在这里找到了类似的主题,这里有一个提示:
CSV.open('file.csv', :row_sep => "\r\n") do |csv|
但不幸的是他没有用…我无法更改CSV文件,所以我需要在代码中修复它。
编辑 CSV文件样本:
A;B;C 1234;...
有什么办法吗?
非常感谢!
首先,您应该将列分隔符设置为“;”,因为这不是解析CSV文件的正常方式。 这对我有用:
CSV.open('file.csv', :row_sep => :auto, :col_sep => ";") do |csv| csv.each { |a,b,c| puts "#{a},#{b},#{c}" } end
从1.9.2 CSV文档:
自动发现会在数据中提前读取下一个
\r\n
,\n
或\r
\n
序列。 即使它出现在引用字段中,也会选择一个序列,假设您在那里有相同的行结尾。
如果任何可能使用奇怪格式的程序(如Excel或电子表格)触摸或保存CSV,则更简单的解决方案:
- 使用任何纯文本编辑器打开文件(我使用Sublime Text 3)
- 按回车键可在任何位置添加新行
- 保存文件
- 删除刚刚添加的行
- 再次保存文件
- 再次尝试导入,错误应该消失
对我来说,我正在导入LinkedIn CSV并收到错误。
我删除了这样的空白行:
def import csv_text = File.read('filepath', :encoding => 'ISO-8859-1') #remove blank lines from LinkedIn csv_text = csv_text.gsub /^$\n/, '' @csv = CSV.parse(csv_text, :headers => true, skip_blanks: true) end
在我的情况下,我必须提供编码,并保证在数据中不会出现的引号字符
CSV.read("file.txt", 'rb:bom|UTF-16LE', {:row_sep => "\r\n", :col_sep => "\t", :quote_char => "\x00"})
如果您必须使用单元格中的换行符来处理来自Excel的文件,那么还有一个解决方案。
这种方式的最大缺点是,字符串中不允许使用分号或双引号。
我选择没有分号
if file.respond_to?(:read) csv_contents = file.read elsif file_data.respond_to?(:path) csv_contents = File.read(file.path) else logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}" return false end result = "string" csv_contents = csv_contents.force_encoding("iso-8859-1").encode('utf-8') # In my case the files are latin 1... # Here is the important part (Remove all newlines between quotes): while !result.nil? result = csv_contents.sub!(/(\"[^\;]*)[\n\r]([^\;]*\")/){$1 + ", " + $2} end CSV.parse(csv_contents, headers: false, :row_sep => :auto, col_sep: ";") do |row| # do whatever end
对我来说,解决方案工作正常,如果你处理大文件,你可能会遇到问题。
如果你想没有引号,只需用引号替换正则表达式中的分号。
我意识到这是一篇旧post,但我最近遇到了类似的问题,格式错误的CSV文件无法用标准的Ruby CSV库进行解析。
我尝试了SmarterCSV gem,它可以立即解析文件。 它是一个外部库,所以它可能不是每个人的最佳解决方案,但它自己解析文件。
opts = { col_sep: ';', file_encoding: 'iso-8859-1', skip_lines: 5 } SmarterCSV.process(file, opts).each do |row| p row[:someheader] end
修复由Excel引起的奇怪格式的另一个简单解决方案是将数据复制并粘贴到Google电子表格中,然后将其下载为CSV。
在我的例子中,电子表格/ CSV的第一行是引言文本的双引号。 我得到的错误是:/Users /…/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1880:in“block(2级)移位”:未加引号字段不允许\ r或\ n(第1行)。 (CSV :: MalformedCSVError)
我删除了带有“字符的注释,因此.csv只有.csv数据,保存它,我的程序没有错误。