2013-10-29 87 views
0

我目前正在導入一個CSV文件並保存這些值。這些值可能包含非ASCII值,例如,®和許多其他文件,導致文件無法解析。有沒有解決的辦法?用特殊的非ASCII字符導入CSV文件?

CSV.foreach(file.path, headers: true) do |row| 
    Yadda yadda 
end 

文件內容破壞foreach

+0

您運行的是哪個版本的Ruby? –

回答

1

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 
1

不確定您使用的是哪個版本的Ruby。我假設它是1.9.3或更高。

嘗試,如果值是訪問,從CSV讀取,你可以使用這樣的幫手以此來force encoding您的CSV文件保存在

force_encoding(encoding) 
0

我不能在Ruby 1.9.3或2.0上覆制問題。我寫了這個測試代碼:

require 'csv' 

CSV.foreach('test.csv') do |row| 
    puts row 
end 

而且創造了這個test.csv文件:

char 
™ 
® 

運行代碼正確顯示的字符。

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。