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 => :"\n"
或 :row_sep => "\r"
,但仍然出现同样的错误。
我很确定我有某种思维错误,但我似乎无法弄清楚。
【问题讨论】:
【参考方案1】:我使用以下方法解决了这个问题:
format_csv = replace_empty_string.gsub(/\r\r?\n?/, "\n")
这最初是 @mgrims answer,但我不得不通过进一步删除 :skip_blanks :row_sep
选项来调整我的代码。
现在正在导入成功!
【讨论】:
以上是关于CSV::MalformedCSVError: 未加引号的字段在 Ruby 中不允许 \r 或 \n的主要内容,如果未能解决你的问题,请参考以下文章
“注意:未定义的变量”、“注意:未定义的索引”、“警告:未定义的数组键”和“注意:未定义的偏移量”使用 PHP