【问题标题】:Importing CSV files to database - Rejecting certain rows将 CSV 文件导入数据库 - 拒绝某些行
【发布时间】:2013-08-08 18:06:25
【问题描述】:

如果我想导入一个包含电子邮件列的 csv 文件,有没有办法 只接受具有有效电子邮件格式的行并拒绝具有无效格式的行?

【问题讨论】:

    标签: mysql ruby-on-rails sqlite csv


    【解决方案1】:

    您可以在消化行时过滤它们。
    我通常解析 CSV 并生成和保存对象。 您可以使用标准验证进行过滤。

    如果我的控制器有一个import 操作并且需要一个csv_file 参数,那么控制器操作如下所示:

    def import
      require "csv"
      if params[:csv_file].present?
        CSV.parse(File.open(params[:csv_file].tempfile){|f| f.read}, headers: true, header_converters: :symbol) do |row|
          obj = MyObject.new(row)
          obj.save # validation filter rows
        end
      end
    end
    

    在你的模型中

    validates_format_of :email, :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
    

    【讨论】:

      【解决方案2】:

      您可以在处理行之前使用正则表达式匹配列内容,例如:

      CSV.foreach(path_to_file, :headers => true) do |row|
        if /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/.match(row['email'])
           #process the row (e.g. insert into database)
        end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-20
        • 1970-01-01
        • 1970-01-01
        • 2016-12-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-15
        • 1970-01-01
        相关资源
        最近更新 更多