かぎラン

2000字くらいの、読んで面白い記事を書きたい。

不正なマルチバイト文字があります - R

Excelでデータを入力してCSVにし、Rに読み込ませることが多い。ところが、読み込ませるだけでWindows版Rではエラーが起きてしまうのだ。

手順1

WindowsmacOS上でExcelからCSVを吐き出させる。最近はただのCSVではなく、エンコーディングUTF-8(ユーティーエフ・エイト)の物を吐き出せるようになっているみたいだ。 Windows上のExcelで作ったCSVcsv_made_by_winexcel.csvmacOS上で作ったものは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では正常に読み込まれ、エラーは起きない(当然)。

f:id:keyprotein:20181220010243p:plain

しかし、Windows版では残念な結果に。

f:id:keyprotein:20181220010759p:plain

<ef>サ<bf>って何だよ。

手順3

「不正なマルチバイト文字があります」という主張なので、Windows謹製memopad.exeでその文字列を取り除いてやろうじゃないか。

f:id:keyprotein:20181220011458p:plain

1行目の先頭にあるらしいが……何も見当たらない。

手順4

色々試してみる。Google検索「R 不正なマルチバイト文字があります」の先頭から9件。

1件目 エンコーディングを明示(1)

r - CSVを読み込もうとすると「不正なマルチバイト文字があります」というエラーが出る - スタック・オーバーフロー

f:id:keyprotein:20181220011917p:plain

意味なし。

2件目

Mac版のRでマルチバイトエラーが出た時は… | 全人類がわかる統計学

MacじゃなくてWindowsの問題なんだよな。

3件目 エンコーディングを明示して上書き保存(1)

【R】csvデータを読み込む時にいろいろエラーが出ることを解消したい - いつかのぎゃふんのために

f:id:keyprotein:20181220013013p:plain

エンコーディングを明示的にUTF-8と指定しろとのこと。memopadとAtomで試したが、参考にならず。

4件目 エンコーディングを明示(2)

R のデータ読み込み時の問題について | DATUM STUDIO株式会社

一時期流行ってたオウンドメディアというもの(ウェブ上にいらない情報を増やし、利便性を下げる元凶)。fileEncodingパラメーターを指定しろとのこと。1番で試したのと同じ。

5件目 エンコーディングを明示(3)

不正なマルチバイト文字 - R七転八倒

また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番と変わらないが、試した。

f:id:keyprotein:20181220014833p:plain

無駄だった。

7件目 エンコーディングを明示(5)

外部データ読み込み時に起こる、マルチ文字エラーの対処 | Takuro Fujita@NITFC

この人も1番と同じ、明示組。

8件目 エンコーディングを明示(6)+メモ帳で編集(新)

Rにcsvを読み込むと二つのエラーが出るときの対処 for mac - Java初心者の語録明示組だけど、末尾にもエラーがあったようだ。

f:id:keyprotein:20181220015658p:plain

これをヒントに、先頭行を改行して上書きしたが、状況は変わらず。

9件目 システムの地域設定を変更(新)

R - ShinyでrunAppを実行すると、 '<ef>サ<bf>Date' に不正なマルチバイト文字があります とエラー|teratail

解決しそうだけど、CUIでいじるような設定は触りたくない。

結局、Google検索結果9件目までに手軽な解決方法は無かった。

手順5

エラー内容からして、先頭に何か悪いものが入っているらしい。Windowsメモ帳よりはパワフルなAtomなら見えるはず。ということで、再度AtomCSVを開き、先頭を探ると、一番先頭にカーソルを置いて右矢印キーを押しても進まないことが判明。見えない何かが1文字あるようだ。

f:id:keyprotein:20181220122422p:plain

見えない1文字を削除して、再びRに読み込ませると、

f:id:keyprotein:20181220021024p:plain

やっと読み込めた。

所感

謎の文字列 %EF%BF%BD

これを見る限り、Excelエンコードに失敗していると思われるExcelさん悪口言ってごめんなさい。

また、一度Googleドライブで変換して、それからCSV形式でダウンロードしたところ、問題なく読み込めた。f:id:keyprotein:20181220021632p:plainなので、大事なデータをGoogleに渡すのはいい気持がしないが、これもひとつの方法ではある。

追伸

テキストファイル | R プログラミング解説

<ef>サ<bf>とはBOM (byte order mark) らしい。

BOMの地雷を踏み抜かない正しい文字コードとの接し方

この有用なタイプのオウンドメディアによれば、Excelの標準文字コードはShift-JISで、 UTF-8エンコードされたCSVはBOMがあれば読み込めるようだ。なので、ExcelUTF-8エンコードされたCSVを吐き出すときは、自分で開けるようにBOMを付加するのだろう。それが、R上では不正なマルチバイト文字としてエラーを引き起こすようだ。

朗報

Excelから書き出すときに、上の方にある「CSV UTF-8 (コンマ区切り) (*.csv)」形式を選択して保存していた。

しかし、下の方にある「CSV (コンマ区切り) (*.csv)」で保存しても、日本語の文字(恐らく2バイト文字全般)が含まれなければUTF-8エンコーディングになることがわかった。そして、BOMは追加されない!

なので、ExcelCSVを書き出し、Rで解析しようという人は、「CSV (コンマ区切り) (*.csv)」を選択しよう。

f:id:keyprotein:20181220133153p:plain