如何在读取CSV文件时跳过“utf 8中的无效字节序列”?

时间:2014-10-14 21:07:31

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

我正在处理一个包含大量列和行的大型CSV文件(数万个,因此几乎无法逐个单元格检查)。

文件中的某个地方可能发生了一个糟糕的角色。我已经尝试使用构造begin - rescue来跳过当前处理的行,如果出现错误(主要是标题中的错误),但它不起作用,脚本将会当它偶然发现角色时停止。

有没有办法忽略/跳过这个"坏"字符/符号? 为了处理CSV文件,我使用的是SmartCSV

编辑:部分代码

datas = SmarterCSV.process(file, {:col_sep => ';', :chunk_size => 100, :remove_empty_values => false, :remove_empty_hashes => false }) do |data|
  begin
    data.each do |d|
      user.something = d[:hobby]
      ...
      here is basically just saving data from the file to database tables
      ...
    end
  rescue => e
    logger.warn "Ooops, an error occurred while processing this record: #{e}" 
  end
end  

我还尝试将begin构造放入data.each,但它也没有帮助避免这种情况。

作为这个问题的解决方案是使用编码文件的每个元素/单元格,但每行有70个单元格...所以我试图寻找更好的解决方案,如果有的话。

EDIT2 :在处理CSV的文件顶部添加# encoding: UTF-8。 CSV文件包含us-ascii字符集。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题并在打开文件时提供编码解决了我的问题:

file = File.open(params[:file].tempfile, "r:bom|utf-8")
SmarterCSV.process(file, {chunk_size: 10000, col_sep: ";"}) do |chunk|
  # ...
end