2018/09/16
Rの文字コード操作で難儀する
Rを使っていて、たまに困るのは「文字コード」の問題です。Rのデフォルトは「UTF-8」なのですが、「Shift-JIS」の項目データを読み込むと文字化けして鬱陶しく感じることがあります。また、UTF-8形式のcsvファイルを、一旦Excelに読み込んで編集し、csv保存すると「Shift-JIS」になってしまう問題も鬱陶しいですね。後者の原因や対策方法は良く分かりませんが、Windows(マイ○ソソフト)の世界では許されることなのでしょう・・・。ちなみに、ubuntuのLibreOffice Calcでは、csvファイルを読み込む際に「文字エンコーディング」を確認してくれて、保存しても読み込んだ際の文字コードで保存してくれます。UTF-8のcsvファイルならばUTF-8に、Shift-JISのcsvファイルならばShift-JISに保存してくれます。マイ○ソソフトのように、身勝手に文字コードを変更することはありません。
Rの環境の文字コードは、「Tools」-「Global Options」で変更できますが、基本はデフォルトのUTF-8で使うようにしています。

まず、UTF-8、Shift-JISのデータファイルを準備しました。それぞれ、utf8_data.csvとshiftJIS_data.csvとします。


#filename <- 'utf8_data.csv'① UTF-8のデータの検証
filename <- 'shiftJIS_data.csv'
#data <- read.csv(filename, header = TRUE) # Error occurred
data <- read.csv(filename, header = TRUE, fileEncoding="Shift-JIS") # OK
plot(data)
1行目ー4行目ー6行目を順番に実行しました。dataは正しく読み込まれ、グラフも描画できました。


② Shift-JISのデータの検証
2行目ー4行目ー6行目を順番に実行しようとしましたが、4行目のファイルを読み込む所で以下のエラーが発生し、6行目は当然実行されませんでした。
make.names(col.names, unique = TRUE) でエラー:Shift-JISの2バイトコードが怒られたようです。ファイルを読み込む際のエンコーディングを指定する必要があり、4行目を5行目に変更して実行しました。今度は、dataも正しく読み込まれ、グラフも描画できました。
'<8d><80><96>ڂP<28>Shift-JIS)' に不正なマルチバイト文字があります


結局、スマートな方法でありませんが、以下のコードに落ち着きました。
#filename <- 'utf8_data.csv'Shift-JISのマルチバイト文字を含むデータファイルが来たら、エラーを発生させ、エラー処理部でShift-JIS形式でファイルを開きます。そのために4行目のtry文を利用します。エラーが発生するとclass(data)に"try-error"が出力されることを利用しました。ちなみにsilent=TRUEはエラーメッセージを表示しない命令です。
filename <- 'shiftJIS_data.csv'
data <- try(read.csv(filename, header = TRUE, fileEncoding="utf-8"),silent=TRUE)
if(class(data)=="try-error"){
data <- read.csv(filename, header = TRUE, fileEncoding="Shift-JIS")
}
plot(data)
もっと良い方法が見つかれば、置き換えようと思いますが、取り急ぎ、この方法で使っていこうと思います。