首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >丢失或偏离第1行引号(CSV::MalformedCSVError)

丢失或偏离第1行引号(CSV::MalformedCSVError)
EN

Stack Overflow用户
提问于 2015-03-26 21:27:59
回答 3查看 14.7K关注 0票数 7

在ruby/rails中导入这个CSV文件有问题

我得到的错误消息是:

代码语言:javascript
运行
复制
Missing or stray quote in line 1 (CSV::MalformedCSVError)

但我不知道发生了什么因为我的CSV看起来很好。以下是样本数据:

代码语言:javascript
运行
复制
"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中,前提是所有迁移都是预先设置的。

代码语言:javascript
运行
复制
lesley_grades   lesley_id   last   first    active  
                 1234556    Doe    John     TRUE    
                 1123445    Doe    John     TRUE

下面是引起我问题的代码的一部分

代码语言:javascript
运行
复制
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从命令行开始,如下所示:

代码语言:javascript
运行
复制
rails runner scripts/import_csv.rb < lesley_grades.csv

然后在这里初始化

代码语言:javascript
运行
复制
CSVImporter.new.import!($stdin)

但正如@smathy建议的那样,我将方法改为CSV.parse(csv.gsub /\r/,'')

但是现在要接受一个def import!块的gsub方法会产生这个错误。

代码语言:javascript
运行
复制
in `import!': undefined method `gsub' for #<IO:<STDIN>> (NoMethodError)

不知道如何使CSV成为一个对象?

有什么建议或重构使这项工作吗?谢谢大家

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-26 21:48:11

您的CSV数据来自Windows和有CRLF (即。"\r\n")行尾,而不是"\n",您需要在尝试解析“r”之前去掉“\r”:

代码语言:javascript
运行
复制
CSV.parse(csv.gsub /\r/, '')

更新

在OP提供更多信息后:

代码语言:javascript
运行
复制
CSV.parse(csv.read.gsub /\r/, '')
票数 16
EN

Stack Overflow用户

发布于 2017-04-13 22:31:15

这个错误也可能是由双引号引起的,双引号不是在字段开始时出现的,也不是用两个双引号转义的。

在下面的示例中,第三个字段将发生错误:

代码语言:javascript
运行
复制
"Issue", "posted by Gary", "He said "I'm having issues importing" ","12345"

“我有问题”中的双引号将被在stray_quote中找到的正则表达式(stray_quote“^”/)捕获,这是csv.rb文件中的一个变量,用于在第1863行引发MalformedCSVError错误。

为了解决这个问题,您需要用另一个双引号来规避双引号,如下所示:

代码语言:javascript
运行
复制
"He said ""I'm having issues importing"" "

希望这能有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2017-04-06 12:31:19

如果CSV列分隔字符设置不正确,也可能会遇到此问题。

默认情况下,Ruby假设,。对于大多数开源软件,比如OpenOffice,都是如此。相反,Microsoft在导出到CSV时使用;

因此,使用col_sep选项如下:

CSV.parse(csv, col_sep: ';')

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29289208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档