CSV::MalformedCSVError: 未加引号的字段在 Ruby 中不允许 \r 或 \n

Posted

技术标签:

【中文标题】CSV::MalformedCSVError: 未加引号的字段在 Ruby 中不允许 \\r 或 \\n【英文标题】:CSV::MalformedCSVError: Unquoted fields do not allow \r or \n in RubyCSV::MalformedCSVError: 未加引号的字段在 Ruby 中不允许 \r 或 \n 【发布时间】:2021-11-11 06:23:25 【问题描述】:

我有 CSV,我正在尝试将其导入我的 oracle 数据库,但不幸的是我不断收到相同的错误:

> CSV::MalformedCSVError: Unquoted fields do not allow \r or \n (line 1).

我知道有很多类似的问题被问到,但除了this 一个之外,没有一个与我的问题特别相关,但不幸的是它没有帮助。

解释我的场景:

我有 CSV,其中的行并不总是以值结尾,但是 相反,只是一个逗号,因为它是一个空值,因此它保持空白。 无论结尾是逗号还是不带逗号,我都想导入 CSV。

这是我的 CSV 的前 5 行,由于隐私原因而更改了值,

id,customer_id,provider_id,name,username,password,salt,email,description,blocked,created_at,updated_at,deleted_at
1,,1,Default Administrator,admin,1,1," ",Initial default user.,f,2019-10-04 14:28:38.492000,2019-10-04 14:29:34.224000,
2,,2,Default Administrator,admin,2,1,,Initial default user.,,2019-10-04 14:28:38.633000,2019-10-04 14:28:38.633000,
3,1,,Default Administrator,admin,3,1," ",Initial default user.,f,2019-10-04 14:41:38.030000,2019-11-27 10:23:03.329000,
4,1,,admin,admin,4,1," ",,,2019-10-28 12:21:23.338000,2019-10-28 12:21:23.338000,
5,2,,Default Administrator,admin,5,1," ",Initial default user.,f,2019-11-12 09:00:49.430000,2020-02-04 08:20:06.601000,2020-02-04 08:20:06.601000

正如您所见,结尾有时带有或不带有逗号,并且这种结构经常重复。

这是我一直在玩的代码:

def csv_replace_empty_string
  Dir.foreach(Rails.root.join('db', 'csv_export')) do |filename|
    next if filename == '.' or filename == '..' or filename == 'extract_db_into_csv.sh' or filename =='import_csv.rb'
    read_file = File.read(Rails.root.join('db', 'csv_export', filename))
    replace_empty_string = read_file.gsub(/(?<![^,])""(?![^,])/, '" "')
    format_csv = replace_empty_string.gsub(/\r\r?\n?/, "\n")
    # format_csv = remove_empty_lines.sub!(/(?:\r?\n)+\z/, "")
    File.open(Rails.root.join('db', 'csv_export', filename), "w") |file| file.puts format_csv 
  end
end

我尝试使用在类似论坛上在线找到的许多不同类型的gsubs,但没有帮助。

这是我在数据库中导入 CSV 的函数:

def import_csv_into_db
  Dir.foreach(Rails.root.join('db', 'csv_export')) do |filename|
    next if filename == '.' or filename == '..' or filename == 'extract_db_into_csv.sh' or filename =='import_csv.rb'
      filename_renamed = File.basename(filename, File.extname(filename)).classify
        CSV.foreach(Rails.root.join('db', 'csv_export',filename), :headers => true, :skip_blanks => true) do |row|
          class_name = filename_renamed.constantize
          class_name.create!(row.to_hash)
          puts "Insert on table #filename_renamed complete"
        end
      end
  end

我也尝试过 CSV 提供的选项,例如 :row_sep =&gt; :"\n":row_sep =&gt; "\r",但仍然出现同样的错误。

我很确定我有某种思维错误,但我似乎无法弄清楚。

【问题讨论】:

【参考方案1】:

我使用以下方法解决了这个问题:

format_csv = replace_empty_string.gsub(/\r\r?\n?/, "\n")

这最初是 @mgrims answer,但我不得不通过进一步删除 :skip_blanks :row_sep 选项来调整我的代码。

现在正在导入成功!

【讨论】:

以上是关于CSV::MalformedCSVError: 未加引号的字段在 Ruby 中不允许 \r 或 \n的主要内容,如果未能解决你的问题,请参考以下文章

在rails迭代CSV,记录错误但不停止循环

常见未授权访问漏洞总结

未找到配置文件:未找到未过期的配置文件

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP

“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP