【问题标题】:Missing or stray quote in line 1 (CSV::MalformedCSVError)第 1 行中缺少或杂散的引号 (CSV::MalformedCSVError)
【发布时间】:2015-05-31 02:29:29
【问题描述】:

在 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 CSV 脚本文件将查找第一列并检查 Active Record 对象是否处于活动状态,然后将其存储在具有完全相同模型名称的数据库中,假设所有迁移都是预设的。

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/, '')

但现在采用gsub 块的def import! 方法会产生此错误

in `import!': undefined method `gsub' for #<IO:<STDIN>> (NoMethodError)

不确定如何使 CSV 成为对象?

有任何建议或重构来完成这项工作吗? 谢谢大家

【问题讨论】:

    标签: ruby-on-rails ruby csv


    【解决方案1】:

    这个错误也可能是由于双引号没有出现在字段的开头并且没有用两个双引号转义。

    以下示例中的第三个字段会出现错误:

    "Issue", "posted by Gary", "He said "I'm having issues importing" ","12345"
    

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

    要解决这个问题,您需要使用另一个双引号来转义双引号,如下所示:

    "He said ""I'm having issues importing"" "
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      因此,像这样使用col_sep 选项:

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

      【讨论】:

        【解决方案3】:

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

        CSV.parse(csv.gsub /\r/, '')
        

        更新

        从 OP 获得更多信息后:

        CSV.parse(csv.read.gsub /\r/, '')
        

        【讨论】:

        • 所以,它显然通过了之前的错误,但现在 csv.gsub 不能工作,因为 csv 不是对象?它来自命令行。检查上述更新。到目前为止,谢谢……我也花了 2 个小时才通过之前的错误。
        • 哦,太棒了!谢谢!我不敢相信我错过了。当然,如果你暗示要给你绿色支票 - 那么当然!
        • 我并不是在暗示这一点,尽管现在这是一个很好的电话:) 阅读 What should I do when someone answers my question? - 摘要:点赞是表达感谢的方式。
        • 这会将整个文件内容读入内存,在大文件中会降低性能。没有别的办法吗??
        • 最近版本的 Ruby 似乎不再与 \r\n 混淆了,您是否尝试仅使用 CSV.foreach 或朋友?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 1970-01-01
        • 2016-09-13
        • 2021-11-11
        • 1970-01-01
        相关资源
        最近更新 更多