【问题标题】:How to skip "invalid byte sequence in utf 8" while reading CSV file?如何在读取 CSV 文件时跳过“utf 8 中的无效字节序列”?
【发布时间】:2014-12-09 19:25:37
【问题描述】:

我正在处理一个包含大量列和行的大型 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 字符集。

【问题讨论】:

  • 有什么方法可以在这里发布您的脚本?
  • 在读取 CSV 文件之前修复并解决文件的编码问题,阅读这篇文章 -> stackoverflow.com/questions/4697413/…
  • @DevDude 说了什么,或者至少是救援尝试。
  • @steenslag 看来这个库真的是关闭了修改,但是看了一圈,我发现这个问题很常见,最好的办法是在尝试其他任何事情之前实际修复编码。跨度>
  • @DevDuda steenslag 谢谢你们的消息,我添加了一些代码来说明我如何处理 CSV 文件。

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


【解决方案1】:

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

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

【讨论】:

  • 您好 bodrovis,感谢您的意见。 "r:bom|utf-8"r:bom 中有什么内容?
  • 现在试试,我们会看到的。
  • 我相信您还需要使用 BOM 将文件重新编码为 UTF-8。
  • 我尝试使用您建议的方法,但不幸的是它不起作用-同样的错误。 I believe you also need to re-encode your file in UTF-8 with BOM. 是什么意思?你能给我举个例子吗?谢谢@bodrovis
  • 如果您有 CSV 文件,您可以使用 Notepad++(或 Excel)将其打开并使用 BOM(Notepad++ 中的编码菜单)以 UTF8 格式保存。不幸的是,我没有其他想法:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-28
  • 2012-01-12
  • 2017-09-02
  • 2015-07-04
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多