使用特殊的非ASCII字符导入CSV文件?

时间:2013-10-29 03:34:53

标签: ruby-on-rails ruby

我目前正在导入CSV文件并保存值。这些值可以包含非ASCII值,例如®和许多其他值,这会导致文件无法解析。有办法解决这个问题吗?

CSV.foreach(file.path, headers: true) do |row|
  Yadda yadda
end

文件内容正在中断foreach

4 个答案:

答案 0 :(得分:1)

不确定您使用的是哪个版本的Ruby。我假设它是1.9.3或更高。

尝试使用此force encoding将您的CSV文件保存在

 force_encoding(encoding)

答案 1 :(得分:1)

如果值可以访问并从CSV读入,您可以使用这样的帮助:

  def ascii_only(string)
    encoding_options = {
        :invalid           => :replace,  # Replace invalid byte sequences
        :undef             => :replace,  # Replace anything not defined in ASCII
        :replace           => '',        # Use a blank for those replacements
        :UNIVERSAL_NEWLINE_DECORATOR => true       # Always break lines with \n
    }
    string.encode Encoding.find('ASCII'), encoding_options
  end

答案 2 :(得分:0)

我不能在Ruby 1.9.3或2.0上复制问题。我写了这个测试代码:

require 'csv'

CSV.foreach('test.csv') do |row|
  puts row
end

并创建了这个test.csv文件:

char
™
®

正确运行代码会显示字符。

答案 3 :(得分:0)

您要做的是编写自定义CSV转换器,然后在调用foreach时在选项哈希中引用该转换器。

自定义转换器:

  #define custom converter to eliminate non ASCII characters
  CSV::Converters[:only_ascii] = lambda{|s| 
    begin 
      s.force_encoding("utf-8").encode("utf-8", "binary", :replace => "", :undef => :replace, :invalid => :replace)
    rescue
      s
    end
  }

然后在你的选项哈希中:

   CSV.foreach(file.path, headers: true, converters: [:only_ascii]) do |row|
     Yadda yadda
   end

现在,如果你想用合理的ASCII等价物而不是空格来替换它们,你可以编写一个自定义函数来执行此操作,然后在自定义转换器中写下:replace => “”,你会这样做:replace => you_custom_method_name_here。