MySQLでCSVファイルをインポートする

はじめに

データベースへのデータ入力は、大変骨の折れる作業だ。少しでも手抜きをするために、ここではcsvファイルに書かれているデータをMySQLへインポートする方法を説明する。基本的にMS-DOSでの操作を示しているが、所々でLinux向けの説明もしている。


ファイルの準備

まずは適当なデータをcsvで用意する。
そしてWinodowsであれば以下のフォルダに、そのCSVファイルを置く。
'C:\ProgramData\MySQL\MySQL Server 5.5\Data\データベース名'
ただしこれは、環境に依存するようなので、それぞれ確認して欲しい。


Linuxであれば/tmp/いかのディレクトリに入れておくのが適切だろう。
ただしここで気をつけなければいけないのは、ファイルとディレクトリのパーミッションだ。Linuxは、この辺りが厳密なので注意が必要だ。フルパスで指定するファイルの上位ディレクトリ全てのパーミッション設定を変更しておく必要がある。
例えば、パーミッション設定が適切でない場合、以下のようにファイルにアクセスできないと泣きついてくる。

mysql> LOAD DATA INFILE "/tmp/Book2.csv" INTO TABLE testdb.book1;
ERROR 13 (HY000): Can't get stat of '/tmp/Book2.csv' (Errcode: 13)


問題が無ければ、全ユーザに対してアクセス権を開放してしまう。これで問題なくインポートができるようになる。

# chmod 777 /tmp



MySQLへインポート

まずは、インポートするデータにあわせてテーブルを作っていく。

CREATE TABLE 2011MonacoGP(
Result int,
CarNumber int,
Driver text,
Team text
);


テーブルの作成完了したら、DESCRIBEコマンドで確認する。

mysql> DESCRIBE 2011MonacoGP;
+-----------+---------+------+-----+---------+-------+
| Field     | Type    | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| Result    | int(11) | YES  |     | NULL    |       |
| CarNumber | int(11) | YES  |     | NULL    |       |
| Driver    | text    | YES  |     | NULL    |       |
| Team      | text    | YES  |     | NULL    |       |
+-----------+---------+------+-----+---------+-------+
4 rows in set (0.16 sec)

問題なく作成できているようだ。


では、肝心のcsvファイルのインポートをLOAD DATAを使って行う。ファイル名を指定している""の中は、フルパスを使ってファイルを指定してもいい。
例えばLinuxでtmpディレクトリの中にファイルを置いてあるのであれば、/tmp/2011Monaco.csvとなる。

mysql> LOAD DATA INFILE "2011MonacoGP.csv"
    -> INTO TABLE 2011MonacoGP FIELDS TERMINATED BY ","
    -> LINES TERMINATED BY "\r\n";
Query OK, 23 rows affected (0.01 sec)
Records: 23  Deleted: 0  Skipped: 0  Warnings: 0


インポートの確認

では、ちゃんとインポートされたか確認してみる。

mysql> select * from 2011MonacoGP;
+--------+-----------+---------------------------------+-----------------------+
| Result | CarNumber | Driver                          | Team                  |
+--------+-----------+---------------------------------+-----------------------+
|      1 |         1 | セバスチャン ベッテル           | レッドブル            |
|      2 |         5 | フェルナンド アロン             | フェラーリ            |
|      3 |         4 | ジェンソン バトン               | マクラーレン          |
|      4 |         2 | マーク ウェバー                 | レッドブル            |
|      5 |        16 | 小林可夢偉                      | ザウバー              |
|      6 |         3 | ルイス ハミルトン               | マクラーレン          |
|      7 |        14 | エイドリアン スーティル         | フォース インディア   |
|      8 |         9 | ニック ハイドフェルド           | ロータス ルノーGP     |
|      9 |        24 | ルーベンス バリチェロ           | ウィリアムズ          |
|     10 |        18 | セバスチャン ブエミ             | トロ ロッ・           |
|     11 |         8 | ニコ ロズベルグ                 | メルセデスGP          |
|     12 |        15 | ポール ディ レスタ              | フォース インディア   |
|     13 |        21 | ヤルノ トゥルーリ               | チーム ロータス       |
|     14 |        20 | ヘイキ コバライネン             | チーム ロータス       |
|     15 |        25 | ジェローム ダンブロシオ         | ヴァージン レーシング |
|     16 |        23 | ヴィタントニオ リウッツィ       | ヒスパニア レーシング |
|     17 |        22 | ナレイン カーティケヤン         | ヒスパニア レーシング |
|      0 |        12 | パストール マルドナド           | ウィリアムズ          |
|      0 |        10 | ヴィタリー ペトロフ             | ロータス ルノーGP     |
|      0 |        19 | ハイメ アルグエルスアリ         | トロ ロッソ           |
|      0 |         6 | フェリペ マッサ                 | フェラーリ            |
|      0 |         7 | ミハエル シューマッハ           | メルセデスGP          |
|      0 |        11 | ティモ グロック                 | ヴァージン レーシング |
+--------+-----------+---------------------------------+-----------------------+

23 rows in set (0.00 sec)
mysql>

問題なく出来ているようだ。
ここで、文字化けが起きているのならば、ファイルの文字コードMySQL文字コードを確認して同じものを指定する。csvファイルの文字コード変換は、テキストエディターのnotepad++を使用した。他のエディターでも問題なく変換できると思う。


ちなみにMySQL文字コードの確認は以下のコマンドで確認出来る。

mysql> show variables like 'character_set%';</pre>

せっかくなのでSQLをたたいてみる。

mysql> SELECT * FROM 2011MonacoGP WHERE Team='レッドブル';
+--------+-----------+-----------------------+------------+
| Result | CarNumber | Driver                | Team       |
+--------+-----------+-----------------------+------------+
|      1 |         1 | セバスチャン ベッテル | レッドブル |
|      4 |         2 | マーク ウェバー       | レッドブル |
+--------+-----------+-----------------------+------------+
2 rows in set (0.07 sec)

と言うことで、レットブルは1位と4位だったようだ。



まとめ

以上のように、MySQLcsvを使ってデータをインポートする方法を説明した。
最初は簡単と思っていたが、実際に作業してみると意外と時間がかかった。またインポートするcsvファイルについても、データの途中に"・"があったり全角スペースが入っていて、エラーを返された。ただ、何度か作業してだいぶMySQLの扱いに慣れてきた感覚がある。何事もへこたれずに取り組むことが大切だと感じた。


参考にしたWebページ
MySQL初心者入門講座 http://mysqlweb.net/category/4005373-1.html