我目前正在导入CSV文件并保存值。这些值可以包含非ASCII值,例如™
,®
和许多其他值,这会导致文件无法解析。有办法解决这个问题吗?
CSV.foreach(file.path, headers: true) do |row|
Yadda yadda
end
文件内容正在中断foreach
。
答案 0 :(得分:1)
答案 1 :(得分:1)
如果值可以访问并从CSV读入,您可以使用这样的帮助:
def ascii_only(string)
encoding_options = {
:invalid => :replace, # Replace invalid byte sequences
:undef => :replace, # Replace anything not defined in ASCII
:replace => '', # Use a blank for those replacements
:UNIVERSAL_NEWLINE_DECORATOR => true # Always break lines with \n
}
string.encode Encoding.find('ASCII'), encoding_options
end
答案 2 :(得分:0)
我不能在Ruby 1.9.3或2.0上复制问题。我写了这个测试代码:
require 'csv'
CSV.foreach('test.csv') do |row|
puts row
end
并创建了这个test.csv文件:
char
™
®
正确运行代码会显示字符。
答案 3 :(得分:0)
您要做的是编写自定义CSV转换器,然后在调用foreach时在选项哈希中引用该转换器。
自定义转换器:
#define custom converter to eliminate non ASCII characters
CSV::Converters[:only_ascii] = lambda{|s|
begin
s.force_encoding("utf-8").encode("utf-8", "binary", :replace => "", :undef => :replace, :invalid => :replace)
rescue
s
end
}
然后在你的选项哈希中:
CSV.foreach(file.path, headers: true, converters: [:only_ascii]) do |row|
Yadda yadda
end
现在,如果你想用合理的ASCII等价物而不是空格来替换它们,你可以编写一个自定义函数来执行此操作,然后在自定义转换器中写下:replace => “”,你会这样做:replace => you_custom_method_name_here。