如何在读取CSV文件时跳过"invalid byte sequence in 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字符集。

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

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

相关内容

最新更新