[R]DBから日本語データを読み込んだ際の文字コードの変更
Rにおいて、「DBI」と「RPostgreSQL」を使ってデータを読み込む方法を以前紹介しました。
http://overlap.hatenablog.jp/entry/2013/05/16/224030
上記の方法は基本的に問題はないのですが、日本語データを読み込む時に文字化けするという問題があります。
(ファイルから読み込む場合は読み込み時に文字コードを指定ますが、DBIパッケージでDBからデータを取得する際に文字コードは指定できないと思われるので。)
この問題は、データをR上に読み込んだ後に文字コードを変更することで解決できます。
以下、具体的な方法について述べます。
ある文字列の文字コードはiconv関数で変換できます。
使い方は
iconv(文字列,from="変換前の文字コード",to="変換後の文字コード")
となります。文字列はvector型で大丈夫です。またfromとtoで変換前のエンコーディングと変換後のエンコーディングを指定します。
実際に使った場合、例えば以下のようになります。
> library(DBI) > library(RPostgreSQL) > con <- dbConnect(PostgreSQL(),host="hostname",user="username",password="password",dbname="dbname") > sql <- dbGetQuery(con,"SELECT prefecture FROM table_name") > head(sql$prefecture) [1] "譚ア莠ャ驛ス" "譚ア莠ャ驛ス" "譚ア莠ャ驛ス" "諢帷衍逵\x8c" "譚ア莠ャ驛ス" "蛹玲オキ驕\x93" > head(iconv(sql$prefecture,from="utf-8",to="cp932")) [1] "東京都" "東京都" "東京都" "愛知県" "東京都" "北海道"
指定できる文字コードは、iconvlist()で確認できます。
> iconvlist() [1] "437" "850" "852" "855" [5] "857" "860" "861" "862" [9] "863" "865" "866" "869" [13] "ANSI_X3.4-1968" "ANSI_X3.4-1986" "ASCII" "ASMO-708" [17] "BIG-5" "BIG-FIVE" "big5" "BIG5" [21] "big5-hkscs" "BIG5-HKSCS" "big5hkscs" "BIG5HKSCS" [25] "CP-GR" "CP-IS" "cp1025" "CP1125" [29] "CP1133" "CP1200" "CP12000" "CP12001" ...
あるテーブルの特定列のエンコーディングを変換したい場合、以下のようにすることで任意の列のエンコーディングを変更することができます。
# sqlテーブルの12列目と14列目の文字コードを変換 > sql[12] <- data.frame(lapply(sql[12],iconv,from="utf-8",to="cp932")) > sql[14] <- data.frame(lapply(sql[14],iconv,from="utf-8",to="cp932"))
これで分析スタートできますね。