【问题标题】:Rails CSV Import Causing Numbers with Leading 0 to Mess UpRails CSV 导入导致带有前导 0 的数字搞砸
【发布时间】:2014-02-21 05:05:08
【问题描述】:

我编写了通过上传的 CSV 文件导入地址的代码,该文件有时包含以 0 开头的邮政编码。

问题在于以 0 开头的邮政编码未正确导入。例如,使用邮政编码02420 导入的地址最终会保存到1296 的数据库中。不知道发生了什么。不确定是否有用于将02420 转换为1296 的模式

所有地址的所有其他邮政编码和方面都正确导入。

这是应用设置:

  • 导轨 4
  • Postgresql
  • Ruby CSV
  • db 中的 Postal Code 列是一个字符串 [character varying(255)]

我的尝试:

  • 在文本编辑器中仔细检查 CSV 文件的数据完整性
  • 创建了 CSV 文件,每个字段都带有引号

感谢您的帮助!

【问题讨论】:

  • 某事将该数字解释为octal number,因为它以“0”开头。
  • 您可能需要向我们展示处理文件的代码。
  • 您可以在此处查看与该问题相关的源代码:gist.github.com/khedaywi/ccf74dd55d0ad0a881d4 正在上传的 CSV 文件也在要点中。我尝试在 csv 中的每个字段周围加上引号,但这没关系。

标签: ruby-on-rails postgresql csv ruby-on-rails-4


【解决方案1】:

好的,所以我想通了。在此过程中,它必须将 02420(或任何其他以 0 开头的数字)转换为八进制数(感谢 Melvin Kicchi

原代码:

CSV.foreach(file.path, headers: true, skip_blanks: true, converters: :all, encoding: 'windows-1251:utf-8') do |row|

修复转换的代码:

CSV.foreach(file.path, headers: true, skip_blanks: true, encoding: 'windows-1251:utf-8') do |row|

需要删除converters: :all,因为解析器正在转换所有不同类型的数据,因此将 02420 作为整数传递,该整数后来变为八进制数。

感谢您的帮助!如果我的理解有误,请纠正我。

你可以阅读更多关于Ruby's CSV Converters

【讨论】:

    【解决方案2】:

    试试这个

     student.addresses.create(
          line1: row["address_line1"],
          line2: row["address_line2"],
          line3: row["address_line3"],
          city: row["address_city"],
          state: row["address_state"],
          postal: row["address_postal"].try(:to_s),
          country: row["address_country"],
          kind: row["address_address_kind"]
        )
    

    【讨论】:

    • 感谢您的帮助!问题最终是我在创建哈希时使用了所有 Ruby 的 CSV 转换器,这很可能最终使所有以 0 开头的东西都变成了八进制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多