require 'csv' CSV.table('test.csv', encoding: "UTF-8" )
このコードでtest.csvを読み込めるんだけど、
一旦エクエルでcsvファイルを開いて保存すると、同じコードでもエラーが出てしまった。
この解決方法?を残しておく。
エラー
ArgumentError: invalid byte sequence in UTF-8 from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:2046:in `=~' from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:2046:in `init_separators' from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:1559:in `initialize' from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:1290:in `new' from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:1290:in `open' from C:/Ruby24-x64/lib/ruby/2.4.0/csv.rb:1356:in `read' from (irb):16
これは、もともとのtest.csvの文字コードは、BOM付のUTF-8 だけど、エクセルで読み込んで保存すると、SJISに変換されてしまうために起きていたエラーだった。
カンマ区切りだったのに、エクセルで保存後、タブ区切りになっていた。
解決策として、まず、csvファイルはそもそもwindowsだとエクセルで開くことが多いので、読み込むcsvファイルの文字コードをSJISにしてあげる。
(SJISでないcsvファイルをエクセルで開いて保存するとSJISになるので、開いて保存してあげたらいい)
そして、エクセルでなくて、メモ帳などのテキストエディタで開いて、タブ区切りになってしまっていたら、タブをカンマに変換してあげる。
そうするとカンマ区切りに対応しているプログラムも変更する必要がない。
SJISのCSVファイルが用意できたら、最初のコードで、csvの読み込み文字コードをSJISにしてあげたらいい。
CSV.table('test.csv', encoding: "SJIS" )
文字コードがらみのエラーって僕みたいな初心者はかなり引っ掛かる。。。。
自動でうまいこと認識してほしい。