我正在处理一个包含大量列和行的大型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
字符集。
答案 0 :(得分:0)
我遇到了类似的问题并在打开文件时提供编码解决了我的问题:
file = File.open(params[:file].tempfile, "r:bom|utf-8")
SmarterCSV.process(file, {chunk_size: 10000, col_sep: ";"}) do |chunk|
# ...
end