Ruby/RailsでShift-JISから UTF-8の変換でエラーが起きた場合の対処方法

Railsで、Shift-JISのCSVをインポートした時に、エンコード周りでエラーがおきていた。

簡単に解決できるかと思ったが、ちょっと方法を試行錯誤したので、対応方法を残しておきます。

前提:使用データ等

CSVファイル:MacのExcelでCSVエクスポート

使っているシステム

Ubuntu

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 18.04.2 LTS
Release:	18.04

Rails

$rails -v
Rails 5.2.3

linuxのエンコードライブラリnkfが必要

インストール

$ apt-get install nkf

やりたかったこと

MacのExcelでCSVをエクスポート(Shift-JIS)

 ↓

CSVをインポート(Railsで使うMySQLはUTF-8)

ということを行おうとした際に、

うまく変換できずにエラーが起きていた。

これは結構ハマったので、メモしておきます。

エラー内容

ちなみに、Railsで表示されていたエラーはこういうの。

XXXX From Shift-JIS to UTF-8
XXXX : 特殊文字のコード

対応方法

以下の手順で対応した

  1. TMPファイルをコピー
  2. コピーファイルの文字コードをnkfコマンドで変換
  3. 変換したファイルをインポート

このような流れでやったが、以下の部分が重要。

FileUtils.cp(path,"/tmp/import.csv")
system('nkf -w --cp932 /tmp/import.csv > /tmp/import_utf8.csv')