我目前正在導入一個CSV文件並保存這些值。這些值可能包含非ASCII值,例如™
,®
和許多其他文件,導致文件無法解析。有沒有解決的辦法?用特殊的非ASCII字符導入CSV文件?
CSV.foreach(file.path, headers: true) do |row|
Yadda yadda
end
文件內容破壞foreach
。
我目前正在導入一個CSV文件並保存這些值。這些值可能包含非ASCII值,例如™
,®
和許多其他文件,導致文件無法解析。有沒有解決的辦法?用特殊的非ASCII字符導入CSV文件?
CSV.foreach(file.path, headers: true) do |row|
Yadda yadda
end
文件內容破壞foreach
。
:
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
不確定您使用的是哪個版本的Ruby。我假設它是1.9.3或更高。
嘗試,如果值是訪問,從CSV讀取,你可以使用這樣的幫手以此來force encoding您的CSV文件保存在
force_encoding(encoding)
我不能在Ruby 1.9.3或2.0上覆制問題。我寫了這個測試代碼:
require 'csv'
CSV.foreach('test.csv') do |row|
puts row
end
而且創造了這個test.csv文件:
char
™
®
運行代碼正確顯示的字符。
你想要做的是編寫一個自定義的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。
您運行的是哪個版本的Ruby? –