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 去掉这个十六进制字符串,问题解决,当然还有更好方案的童鞋欢迎指正