2016-09-15 25 views
0

まずこのここSO question .Iの複製ではありませんがShift-JIS でエンコードされたCSVファイルを持っている、これは解析する私のスクリプトですファイルUTF-8でのRuby `CSV.read`エラー無効なバイトシーケンス(例外ArgumentError)

require 'csv' 
str1 = '社員番号' 
str2 = 'メールアドレス' 
str1.force_encoding("Shift_JIS").encode! 
str2.force_encoding("Shift_JIS").encode! 
file=File.open("SyainInfo.csv", "r:Shift_JIS") 
csv = CSV.read(file, headers: true) 
p csv[str1] 
p csv [str2] 

エンコーディングを指定した後でも、私はinvalid byte sequence in UTF-8 (ArgumentError)を取得しています。何かご意見は?私のルビーは、すべての2.3.0

答えて

3

まずで、あなたのエンコーディングが正しく表示されません:あなたはおそらく変換にしたいのに対し

'社員番号'.force_encoding("Shift_JIS").encode! 
#=> "\x{E7A4}\xBE\x{E593}\xA1\x{E795}\xAA\x{E58F}\xB7" 

force_encodingは、str1からバイトを取り、シフトJISとしてそれらを解釈しますシフトJIS文字列:

'社員番号'.encode('Shift_JIS') 
#=> "\x{8ED0}\x{88F5}\x{94D4}\x{8D86}" 

次は、CSV.readにファイル名を渡し、その代わりにすることができます

file = File.open(filename) 
CSV.read(file) 

あなただけ書くことができます:あなたはシフトJISエンコードされた文字列と仕事のどちらかでし、言っ

CSV.read(filename) 

require 'csv' 
str1 = '社員番号'.encode("Shift_JIS") 
str2 = 'メールアドレス'.encode("Shift_JIS") 
csv = CSV.read('SyainInfo.csv', encoding: 'Shift_JIS', headers: true) 
csv[str1] 
csv[str2] 

か - あなたと仕事ができる - と、それは私がどうなるのかだが第2のエンコーディングを指定してUTF-8文字列を指定します。

require 'csv' 
str1 = '社員番号' 
str2 = 'メールアドレス' 
csv = CSV.read('SyainInfo.csv', encoding: 'Shift_JIS:UTF-8', headers: true) 
csv[str1] 
csv[str2] 

encoding: 'Shift_JIS:UTF-8'CSVにShift JISデータを読み取り、UTF-8にトランスコードするように指示します。これは、'r:Shift_JIS:UTF-8'File.open

+0

にお送りいただきありがとうございます。私はあなたのソリューションを試してみましたが、Shift_JISからUTF-8(Encoding :: UndefinedConversionError)に「\ xFB \ xFC」を取得しています。 ' –

+0

@TonyVincentどこからエラーが出ますか?あなたのコードに 'gets 'が表示されません。 – Stefan

+0

rubのcsvクラスからのものです 'usr/local/lib/ruby​​/2.3.0/csv.rb:1807:gets ...' –

関連する問題