Rails (已解决) Rails 中 CSV.parse 在开发环境工作正常,而在 production 环境下不工作

jasonZYJ · 2014年03月03日 · 3185 次阅读

1.一段读取解析 csv 文件:代码如下

  require 'csv'
  require 'cmess/guess_encoding'
  require 'iconv'

def parse_csv (file_name)
    charset = guess_encoding file_name
    csv=nil
    File.open(file_name, "rb", :external_encoding => charset, :internal_encoding => "UTF-8") { |f| csv = f.read }
    Rails.logger.error("File read csv:#{csv}")
    csv=Iconv.conv("utf-8", charset, csv) unless charset == "UTF-8"
    Rails.logger.error("Iconv conv csv:#{csv}")
    rows = CSV.parse(csv, :col_sep => ",")
    Rails.logger.error("CSV parse csv:#{rows}")
    rows
  end

2.Config/application.eb中代码如下:

require File.expand_path('../boot', __FILE__)
require 'csv'
require 'rails/all'

3.Development 环境下工作 ok,log 输出正常,但是 production 环境下 log 只会输出到前两个,第三个未输出,CSV.parse 此时未工作,何解?? 经过查看 production log,报了这个错 Java::JavaLang::ArrayIndexOutOfBoundsException (-69);然后打印出 file.open 读取的 csv 字段,发现字段是已完全读取,但是在 header 的最开始的部分却多了个问号,就像下面这个 sample_data(csv file has 7columns): "?Purchaser,Purchaser ID,Supplier,Supplier ID,Product,Product ID,Billing Rate Le Meridien Shimei Bay Beach Resort and Spa,5033,hainan company,12897,Lamp T5-21W 2700K,665369,0.5";此时读出的 string 为什么会多一个问号呢?? 而且此读出的字符串 encoding 为 UTF-8,会跳过 Iconv.conv 直接到 CSV.parse,此时就会曝出 ArrayIndexOutOfBoundsException 错误,初步估计就是那个问号导致;而且本地 development 环境打印出来看不到此符号,但是 production 上 log 上就会有此问号

解决:读取 csv 文件 header 第一个字段前面会加上 16 进制串:“\xEF\xBB\xBF”导致解析的错误,解决方法就是 sub 去掉这个十六进制字符串,问题解决,当然还有更好方案的童鞋欢迎指正

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请 注册新账号