How to use :replace, :invalid and :undef args for encoding using CSV.read?

定点観測用のRubyプログラムで、Excell表示させたいためにUTF-8からSJISに文字コートを変換しようとしているんだけど。
こんなエラーが出てしまう。

[bash]
/usr/share/ruby/2.2.0/csv.rb:1798:in `gets’: U+FF5E from UTF-8 to Shift_JIS (Encoding::UndefinedConversionError)
from /usr/share/ruby/2.2.0/csv.rb:1798:in `block in shift’
from /usr/share/ruby/2.2.0/csv.rb:1796:in `loop’
from /usr/share/ruby/2.2.0/csv.rb:1796:in `shift’
from /usr/share/ruby/2.2.0/csv.rb:1738:in `each’
from utf82sjis_column.rb:16:in `’
[/bash]

どうやら、変換できない文字コードがある模様。

ソースは単純に、

[ruby]
refcsv = CSV.open(ARGV[0], encoding: "UTF-8:Shift_JIS")
refcsv.each { |row|
[/ruby]

なのだけど。

色々と調べてみたら、次のようなページがあってガッカリ。
CSV を文字コード変換しつつロード

流石に、Kernel#openはちょっと…。とおもったら、次の情報があった。

How to use :replace, :invalid and :undef args for encoding using CSV.read?

ロジックを

[ruby]
SJIS_CONVERTER = ->(field) { field.encode(‘Shift_JIS’,invalid: :replace, undef: :replace, replace: "" ) }

refcsv = CSV.open(ARGV[0], encoding: "UTF-8", converters: SJIS_CONVERTER)
[/ruby]

に書き換えて、OK。

Leave A Comment?