CSV - 未加引号的字段不允许\ r或\ n(第2行)

时间:2012-07-18 19:12:15

标签: ruby-on-rails ruby csv fastercsv

尝试解析CSV文件,但仍然收到错误消息未加引号的字段不允许\ r或\ n(第2行)。

我在这里找到了类似的主题,这里有一个提示:

  CSV.open('file.csv', :row_sep => "\r\n") do |csv|

但遗憾的是他不能使用我...我无法更改CSV文件,所以我需要在代码中修复它。

编辑 CSV文件样本:

A;B;C
1234;...

有什么办法吗?

非常感谢!

8 个答案:

答案 0 :(得分:15)

首先,您应该将列分隔符设置为“;”,因为这不是解析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序列。即使发生了序列,也会选择序列   在引用字段中,假设您将具有相同的行结尾   那里。

答案 1 :(得分:13)

如果任何可能使用了奇怪格式的程序(例如Excel或电子表格)触摸或保存了CSV,则更简单的解决方案:

  1. 使用任何普通文本编辑器打开文件(我使用Sublime Text 3)
  2. 按回车键在任何地方添加新行
  3. 保存文件
  4. 删除刚刚添加的行
  5. 再次保存文件
  6. 再次尝试导入,错误应该消失

答案 2 :(得分: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

答案 3 :(得分:1)

在我的情况下,我必须提供编码,并且保证在数据中不会出现引用字符

CSV.read("file.txt", 'rb:bom|UTF-16LE', {:row_sep => "\r\n", :col_sep => "\t", :quote_char => "\x00"})

答案 4 :(得分:0)

如果您必须使用单元格中的换行符来处理来自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

对我来说,解决方案运行正常,如果您处理大文件,可能会遇到问题。

如果你想没有引号,只需用引号替换正则表达式中的分号。

答案 5 :(得分:0)

我意识到这是一篇过时的文章,但是最近我遇到了类似的问题,即格式错误的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

答案 6 :(得分:-1)

就我而言,电子表格/ CSV的第一行是引言文本的双引号。我得到的错误是: /Users/.../.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1880:in在阻止(2级)转移':不带引号的字段不允许\ r或\ n(第1行)。 (CSV :: MalformedCSVError)

我用"删除了评论。因此.csv只有.csv数据,保存它,我的程序没有错误。

答案 7 :(得分:-2)

修复由Excel引起的奇怪格式的另一个简单解决方案是将数据复制并粘贴到Google电子表格中,然后将其下载为CSV格式。