在 Rails 上导入 CSV 期间的未知属性“headers ...”

Posted

技术标签:

【中文标题】在 Rails 上导入 CSV 期间的未知属性“headers ...”【英文标题】:Unknow attribute 'headers ...' during CSV import on Rails 【发布时间】:2018-07-19 14:39:25 【问题描述】:

我尝试在 Mac 上导入使用 Numbers 创建的 CSV 时遇到问题,

以前在 Ubuntu 上使用 LibreOffice 一切正常,

当我尝试导入 CSV 文件时出现错误

unknown attribute 'adress   user_id room_type etc...' for Bien.

我认为它不会检测分隔符并将第一个听者行作为一个字符串。

我的导入函数:

def self.import(file)
  CSV.foreach(file.path, headers: true) do |row|
    @bien = Bien.create! row.to_hash
    @bien.save
  end 
end

当我在 Numbers 上创建 CSV 时,我会知道如何导入文件以及是否需要更改。

更新

【问题讨论】:

您能提供Bien 属性和CSV 文件的前几行吗? @Leo 我更新了 CSV 的截图 我怀疑由于您的 adress 列中的值带有逗号,Numbers 可能将您的分隔符从逗号更改为其他内容(可能是分号)。看我的回答,我觉得适用***.com/a/51426119/3477163 @AntoineWako 在 Calc 中提供内容的屏幕截图非常棒。但是您能否也提供生成的 CSV(不是屏幕截图,而是纯文本代码块)?结果可能会因 LibreOffice 中所选的 CSV 设置而异。 【参考方案1】:

我认为您是完全正确的,看起来分隔符没有得到尊重,因此标题行显示为一个长字符串。要进行调试,您可以尝试将 pry 放入并运行 CSV.read(file.path) 以查看转换为 CSV 的整个输出。完成此操作后,您应该能够看到 Numbers 用于分隔符的内容。

This post 建议 Numbers 使用分号作为默认分隔符,因此如果您将 col_sep: ';' 定义为选项,则可能会成功。 (参考:CSV docs)。

所以,代码是

def self.import(file)
  CSV.foreach(file.path, col_sep: ';', headers: true) do |row|
    @bien = Bien.create! row.to_hash
    @bien.save
  end 
end

【讨论】:

我看到分隔符是空格,所以我用 LibreOffice 更改了分隔符,现在它的工作谢谢!

以上是关于在 Rails 上导入 CSV 期间的未知属性“headers ...”的主要内容,如果未能解决你的问题,请参考以下文章

ActiveModel::UnknownAttributeError: WorkOrder 的未知属性“”

如何在 Rails 中解析 CSV 期间更改编码

Rails:红宝石在导轨上的未知属性错误

错误 #1054 - 尝试将 CSV 文件导入数据库时​​,字段列表中出现未知列

在 csv 导入 pandas 期间跳过行

Rails中如何将MaxMind本地数据、CSV文件导入redis?