23

尝试解析 CSV 文件,但仍收到错误消息Unquoted fields do not allow \r or \n (第 2 行)。.

我在这里找到了类似的主题,其中有以下提示:

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

但不幸的是,他对我不起作用......我无法更改 CSV 文件,所以我需要在代码中修复它。

编辑CSV 文件示例:

A;B;C
1234;...

有什么办法吗?

非常感谢!

4

9 回答 9

17

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

于 2012-07-18T19:42:28.837 回答
15

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

  1. 使用任何纯文本编辑器打开文件(我使用了 Sublime Text 3)
  2. 按回车键在任意位置添加新行
  3. 保存文件
  4. 删除刚刚添加的行
  5. 再次保存文件
  6. 再次尝试导入,错误应该消失了
于 2015-09-10T22:57:15.917 回答
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
于 2016-06-17T10:29:42.413 回答
2

就我而言,我必须提供编码和保证不会出现在数据中的引号字符

CSV.read("file.txt", 'rb:bom|UTF-16LE', {:row_sep => "\r\n", :col_sep => "\t", :quote_char => "\x00"})
于 2016-01-26T17:28:23.707 回答
1

我意识到这是一篇旧文章,但我最近遇到了一个类似的问题,即格式错误的 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
于 2018-10-25T21:04:54.330 回答
1

请参阅此线程未加引号的字段不允许 \r 或 \n

解决方案:

file = open(file.csv).read.gsub!("\r", '')
CSV.open(file, :row_sep => "\r\n") do |csv|
于 2021-08-30T08:38:35.687 回答
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

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

如果您不想使用引号,只需将正则表达式中的分号替换为引号即可。

于 2017-02-08T10:25:17.683 回答
0

就我而言,电子表格/CSV 的第一行是一段双引号的介绍文本。我得到的错误是:/Users/.../.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1880:in `block (2 levels) in shift': Unquoted字段不允许 \r 或 \n(第 1 行)。(CSV::MalformedCSVError)

我删除了带有 " 字符的注释,因此 .csv 只有 .csv 数据,保存它,并且我的程序没有错误地运行。

于 2016-10-27T20:34:03.157 回答
-4

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

于 2016-02-12T03:13:07.550 回答