Rails导入CSV错误:UTF-8中的字节序列无效

时间:2015-10-10 23:00:31

标签: ruby-on-rails ruby csv ruby-on-rails-4 utf-8

尝试在我的Rails应用程序中导入CSV文件时收到错误invalid byte sequence in UTF-8。一切正常,直到我添加了gsub方法,将其中一个CSV列与我数据库中的字段进行比较。

当我导入CSV文件时,我想检查每行的地址是否包含在特定客户端的不同地址的数组中。我有一个alt_addresses属性的客户端模型,其中包含客户端地址的几种不同格式。

然后我有一个引用模型(如果你熟悉本地搜索引擎优化你会知道这个术语)。引文模型没有地址字段,但它有一个nap_correct?字段(NAP代表“名称”,“地址”,“电话号码”)。如果CSV行的名称,地址和电话号码与我在该客户端的数据库中的名称,地址和电话号码相同,则该引文的nap_correct?字段将设置为“正确”。

以下是我的引文模型中import方法的样子:

def self.import(file, client_id)
  @client = Client.find(client_id)
  CSV.foreach(file.path, headers: true) do |row|
    @row = row.to_hash
    @citation = Citation.new
    if @row["Address"]
      if @client.alt_addresses.include?(@row["Address"].to_s.downcase.gsub(/\W+/, '')) && self.phone == @row["Phone Number"].gsub(/[^0-9]/, '')
        @citation.nap_correct = true
      end
    end
    @citation.name = @row["Domain"]
    @citation.listing_url = @row["Citation Link"]
    @citation.save
  end
end

然后,这是alt_addresses属性在我的客户端模型中的样子:

def alt_addresses
  address = self.address.downcase.gsub(/\W+/, '')
  address_with_zip = (self.address + self.zip_code).downcase.gsub(/\W+/, '')
  return [address, address_with_zip]
end

我正在使用gsub重新格式化CSV中的地址列以及客户端数据库表中的字段,以便我可以比较这两个值。这就是问题所在。只要我添加了gsub方法,我就开始收到无效的字节序列错误。

我正在使用Ruby 2.1.3。我注意到很多类似的错误,我发现搜索Stack Overflow与旧版本的Ruby有关。

2 个答案:

答案 0 :(得分:16)

使用encoding选项指定编码:

CSV.foreach(file.path, headers: true, encoding: 'iso-8859-1:utf-8') do |row|
 # your code here
end

答案 1 :(得分:1)

我想出办法解决这个问题的方法是在开放式办公室或自由办公室“另存为”,然后点击“编辑过滤器设置”,然后确保字符集为UTF-8并保存。最重要的是,在将字符加载到ruby之前,使用一些外部工具将字符转换为utf-8兼容字符。这个问题可能只是红宝石中真正的迷宫

一个名为iconv的unix工具显然可以做这种事情。 https://superuser.com/questions/588048/is-there-any-tools-which-can-convert-any-strings-to-utf-8-encoded-values-in-linu