【问题标题】:Carrierwave: clean CSV before uploadCarrierwave:上传前清理 CSV
【发布时间】:2019-10-14 10:00:54
【问题描述】:

我有一个 Carrierwave 上传器 InventoryUploader,我用它来存储格式为 text/csvapplication/vnd.ms-excel 的文件。我在处理文件时遇到了一些无效的字节序列错误,所以我想在上传之前清除它们。

我在 Carrierwave 上传器上创建了一个 process :clean_file 回调,但我正在努力寻找一种在上传之前清除任何 BOM/时髦字符的好方法。

有没有一种巧妙的方法来做到这一点?我正在尝试类似的东西:

class InventoryUploader < CarrierWave::Uploader::Base
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{model.id}"
  end  

  def content_type_whitelist
    %w(text/csv application/vnd.ms-excel)
  end

  process :clean_file

  private

  def clean_file
    # Perhaps something like this?
    # but how can I ensure it removes all weird
    # character sequences?
    CSV.foreach(file.path, headers: true, encoding: 'UTF-8') do |row|
      row.each do |field|
        field[1].gsub!("\xEF\xBB\xBF".force_encoding("UTF-8"), '')
      end
    end
  end
end

提前致谢!

【问题讨论】:

    标签: ruby-on-rails excel csv carrierwave


    【解决方案1】:

    使用以下代码可以做到这一点:

    require 'tempfile'
    
    class InventoryUploader < CarrierWave::Uploader::Base
      def store_dir
        "uploads/#{model.class.to_s.underscore}/#{model.id}"
      end
    
      def content_type_whitelist
        %w(text/csv application/vnd.ms-excel)
      end
    
      process :clean_file
    
      private
    
      def clean_file
        tempfile = Tempfile.open('temp_csv', encoding: 'utf-8') do |f|
          File.foreach(current_path) do |line|
            f.puts line.encode('UTF-8', invalid: :replace, undef: :replace)
          end
          f
        end
        FileUtils.mv(tempfile.path, current_path)
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2014-03-17
      • 1970-01-01
      • 2019-05-02
      • 2018-05-12
      • 2012-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-07
      相关资源
      最近更新 更多