不正なマルチバイト文字があります - R
Excelでデータを入力してCSVにし、Rに読み込ませることが多い。ところが、読み込ませるだけでWindows版Rではエラーが起きてしまう。 どうにかして問題をクリアできました。以下、問題発生手順と解決策です……
手順1
WindowsとmacOS上でExcelからCSVを吐き出させる。最近はただのCSVではなく、エンコーディングがUTF-8(ユーティーエフ・エイト)の物を吐き出せるようになっているみたいだ。
Windows上のExcelで作ったCSVはcsv_made_by_winexcel.csv
、macOS上で作ったものはcsv_made_by_macexcel.csv
と命名。
手順2
Rで読み込ませる。
maccsv <- read.csv("csv_made_by_macexcel.csv") wincsv <- read.csv("csv_made_by_winexcel.csv")
macOS版Rでは正常に読み込まれ、エラーは起きない(当然)。
しかし、Windows版では残念な結果に。
<ef>サ<bf>
って何だよ。
手順3
「不正なマルチバイト文字があります」という主張なので、Windows謹製memopad.exeでその文字列を取り除いてやろうじゃないか。
1行目の先頭にあるらしいが……何も見当たらない。
手順4
色々試してみる。Google検索「R 不正なマルチバイト文字があります」の先頭から9件。
1件目 エンコーディングを明示(1)
r - CSVを読み込もうとすると「不正なマルチバイト文字があります」というエラーが出る - スタック・オーバーフロー
意味なし。
2件目
Mac版のRでマルチバイトエラーが出た時は… | 全人類がわかる統計学
3件目 エンコーディングを明示して上書き保存(1)
【R】csvデータを読み込む時にいろいろエラーが出ることを解消したい - いつかのぎゃふんのために
エンコーディングを明示的にUTF-8と指定しろとのこと。memopadとAtomで試したが、参考にならず。
4件目 エンコーディングを明示(2)
R のデータ読み込み時の問題について | DATUM STUDIO株式会社
一時期流行ってたオウンドメディアというもの(ウェブ上にいらない情報を増やし、利便性を下げる元凶)。fileEncodingパラメーターを指定しろとのこと。1番で試したのと同じ。
5件目 エンコーディングを明示(3)
また1番と同じ。ここから、txtのデータをタブ区切りで読み込むようにRに命令。/
law <- read.table("blog1.txt",head=T,sep=",",na.strings="NA")
タブ区切りって自分で言ってるのに区切り文字をわざわざカンマと指定しているあたり、ここのくだりはギャグセンスがある。
6件目 エンコーディングを明示(4)
こんな書き方もあるのか。data <- read.csv(file("test.csv", encoding="shift-jis"), sep=",", header=T, row.names=1)
本質的には1番と変わらないが、試した。
無駄だった。
7件目 エンコーディングを明示(5)
外部データ読み込み時に起こる、マルチ文字エラーの対処 | Takuro Fujita@NITFC
この人も1番と同じ、明示組。
8件目 エンコーディングを明示(6)+メモ帳で編集(新)
Rにcsvを読み込むと二つのエラーが出るときの対処 for mac - Java初心者の語録明示組だけど、末尾にもエラーがあったようだ。
これをヒントに、先頭行を改行して上書きしたが、状況は変わらず。
9件目 システムの地域設定を変更(新)
R - ShinyでrunAppを実行すると、 '<ef>サ<bf>Date' に不正なマルチバイト文字があります とエラー|teratail
解決しそうだけど、CUIでいじるような設定は触りたくない。
結局、Google検索結果9件目までに手軽な解決方法は無かった。
手順5
エラー内容からして、先頭に何か悪いものが入っているらしい。Windowsメモ帳よりはパワフルなAtomなら見えるはず。ということで、再度AtomでCSVを開き、先頭を探ると、一番先頭にカーソルを置いて右矢印キーを押しても進まないことが判明。見えない何かが1文字あるようだ。
見えない1文字を削除して、再びRに読み込ませると、
やっと読み込めた。
所感
これを見る限り、Excelがエンコードに失敗していると思われる。Excelさん悪口言ってごめんなさい。
また、一度Googleドライブで変換して、それからCSV形式でダウンロードしたところ、問題なく読み込めた。なので、大事なデータをGoogleに渡すのはいい気持がしないが、これもひとつの方法ではある。
追伸
<ef>サ<bf>
とはBOM (byte order mark) らしい。
この有用なタイプのオウンドメディアによれば、Excelの標準文字コードはShift-JISで、 UTF-8でエンコードされたCSVはBOMがあれば読み込めるようだ。なので、ExcelがUTF-8でエンコードされたCSVを吐き出すときは、自分で開けるようにBOMを付加するのだろう。それが、R上では不正なマルチバイト文字としてエラーを引き起こすようだ。
朗報
Excelから書き出すときに、上の方にある「CSV UTF-8 (コンマ区切り) (*.csv)」形式を選択して保存していた。
しかし、下の方にある「CSV (コンマ区切り) (*.csv)」で保存しても、日本語の文字(恐らく2バイト文字全般)が含まれなければUTF-8エンコーディングになることがわかった。そして、BOMは追加されない!
なので、ExcelでCSVを書き出し、Rで解析しようという人は、「CSV (コンマ区切り) (*.csv)」を選択しよう。