エクセルファイルの文字エンコーディング
前回つくったCSVファイルの文字エンコーディングはUTF-8になっている。
UTF-8のファイルはエクセルでつかえない(つかいづらい)。
今回はエクセルの文字エンコーディングとRubyの文字エンコーディングについて考える。
目次
エクセルの文字エンコーディング
エクセルデータの標準文字エンコーディングはShift_JIS。
それに対してRubyの標準文字エンコーディングはUTF-8。
なので、どこかで文字エンコーディングを変更しないとデータのやり取りができない。
Rubyで文字エンコーディングを変更する
エクセルでつくったCSVファイルをRubyに読み込む方法
わたしはエクセルを持っていないので、今回書くコードはエクセルでの動作確認をしていません。
次の画像のような表計算アプリファイルをsample.csvという名のCSVファイルに書き出す。
sample.csv
順位,クルー名,タイム 1,A会社,05:50.01 2,B大学,05:52.12 3,C大学,05:54.34
エクセルの標準設定だとCSVファイルに書き出すときの文字エンコーディングはShift-JISになっている。
これをRubyで読み込む。
test.rb
sample_csv = open("sample.csv","r:shift_jis") sample_sjis = sample_csv.read sample_utf8 = sample_sjis.encode("utf-8") sample_csv.close puts sample_utf8
コードの説明。
- sample.csvを読み込みモード
r
に:shift_jisオプションをつけて開く - 開いたsample.csvをreadメソッドで読み込む
- 読み込んだsample.csvの文字エンコーディングをencodeメソッドで変更する
- encodeメソッドの引数には変更後の文字エンコーディングをいれる
- 開いたファイルをcloseメソッドで閉じる
- 読み込んだUTF-8ファイルをputsメソッドで出力する
実行結果は、上のsample.csvと同じ内容がターミナル/PowerShellに表示される。
エクセルで読み込めるCSVファイルをRubyでつくる
エクセルで読み込めるように文字エンコーディングがShift-JISのCSVファイルをつくる。
test.rb
str = "順位,クルー名,タイム\n1,A会社,05:50.01\n2,B大学,05:52.12\n3,C大学,05:54.34" open("sample_sjis.csv","w:shift_jis") do |file| file.write str end
コードの説明。
- カンマ区切りの文字列データをつくる
- sample_sjis.csvファイルを書き込みモード
w
に:shift_jisオプションをつけてつくる(開く) - つくった(開いた)CSVファイルにwriteメソッドでカンマ区切りデータを書き込む
上のコードでできたファイルはエクセルで読み込めるはず。
今回の動作確認環境
Ruby 2.4.3p205
macOS 10.13.3
ターミナル
Windows10
Windows PowerShell