在ruby/rails中导入这个CSV文件有问题
我得到的错误消息是:
Missing or stray quote in line 1 (CSV::MalformedCSVError)
但我不知道发生了什么因为我的CSV看起来很好。以下是样本数据:
"lesley_grades","lesley_id","last","first","active","site","cohort","section","sections_title","faculty","completed_term_cred","term","sec_start_date","sec_end_date","grade","stc_cred","active_program","most_recent_program","intent_filed","stc_term_gpa","sta_cum_gpa","start_term","prog_status","last_change_date"
,1234456,John,Doe,TRUE,"Baltimore, MD",0002012,14/FA_ERLIT_6999_U15AA,Directed Independent Study,"Jane Hicks , Jill Saunders",2,14/FA,9/3/14,12/17/14,B-,2,EME.2270.TCBAL.01,EME.2270.TCBAL.01, ,3.3,3.148,12/SU,A,9/2/14
,1234455,John,Doe,TRUE,"Baltimore, MD",0002012,14/FA_ERSPD_6999_U15AG,Directed Independent Study,"Jane Hicks , Jill Saunders",3,14/FA,9/3/14,12/17/14,A-,3,EME.2270.TCBAL.01,EME.2270.TCBAL.01, ,3.3,3.148,12/SU,A,9/2/14
为了提供上下文,csv实际上如下所示,第一列是lesley_grades。over脚本文件将查找第一列并检查活动记录对象,然后将它以完全相同的模型名存储在db中,前提是所有迁移都是预先设置的。
lesley_grades lesley_id last first active
1234556 Doe John TRUE
1123445 Doe John TRUE
下面是引起我问题的代码的一部分
def import!(csv)
csv_reader = CSV.parse(csv)
ActiveRecord::Base.transaction do
csv_reader.each do |row|
set_record_class_and_columns(row) if header_row?(row)
if columns_mapping_defined? && record_class_defined? && record_row?(row)
import_row(row)
end
end
if imports_failed?
puts 'Aborting importing and rolling back...'
show_errors
raise ActiveRecord::Rollback
end
end
结束
它不能通过这行csv_reader = CSV.parse(csv)
在我把引号放进标头之前,我得到了这个错误
Unquoted fields do not allow \r or \n (line 1). (CSV::MalformedCSVError)
更新
CSV从命令行开始,如下所示:
rails runner scripts/import_csv.rb < lesley_grades.csv
然后在这里初始化
CSVImporter.new.import!($stdin)
但正如@smathy建议的那样,我将方法改为CSV.parse(csv.gsub /\r/,'')
但是现在要接受一个def import!
块的gsub
方法会产生这个错误。
in `import!': undefined method `gsub' for #<IO:<STDIN>> (NoMethodError)
不知道如何使CSV成为一个对象?
有什么建议或重构使这项工作吗?谢谢大家
发布于 2015-03-26 21:48:11
您的CSV数据来自Windows和有CRLF (即。"\r\n")行尾,而不是"\n",您需要在尝试解析“r”之前去掉“\r”:
CSV.parse(csv.gsub /\r/, '')
更新
在OP提供更多信息后:
CSV.parse(csv.read.gsub /\r/, '')
发布于 2017-04-13 22:31:15
这个错误也可能是由双引号引起的,双引号不是在字段开始时出现的,也不是用两个双引号转义的。
在下面的示例中,第三个字段将发生错误:
"Issue", "posted by Gary", "He said "I'm having issues importing" ","12345"
“我有问题”中的双引号将被在stray_quote中找到的正则表达式(stray_quote“^”/)捕获,这是csv.rb文件中的一个变量,用于在第1863行引发MalformedCSVError错误。
为了解决这个问题,您需要用另一个双引号来规避双引号,如下所示:
"He said ""I'm having issues importing"" "
希望这能有所帮助。
发布于 2017-04-06 12:31:19
如果CSV列分隔字符设置不正确,也可能会遇到此问题。
默认情况下,Ruby假设,
。对于大多数开源软件,比如OpenOffice,都是如此。相反,Microsoft在导出到CSV时使用;
。
因此,使用col_sep
选项如下:
CSV.parse(csv, col_sep: ';')
https://stackoverflow.com/questions/29289208
复制相似问题