プロが教えるわが家の防犯対策術!

MySQL 5.6を最近使い始めました。
大量のcsvファイルで保存されているデータを読み込んで、データベースとして扱いたいのですが、どうすれば良いでしょうか?

ファイル名は、
data1_1.csv
data1_2.csv
data1_3.csv
data2_1.csv
data2_2.csv
といった形で、規則正しく並んでいるのですが、大量にあるため、ループを使って自動化したいと思っております。そのために、LOAD DATA INFILE ファイル名 を使って、このファイル名を順次変えて繰り返す方法がわかりません。

まず、ファイル名に変数が使えるのかと思って @file="data1_1.csv"としてファイル名を置き換えてみたのですが、エラーでした。これでは、この1_1を順次動かす以前に変数が無理なのかも?と思っています。

何かやり方があるようでしたら、どなたかお教えください。
どうぞよろしくお願いいたします。

A 回答 (4件)

スクリプトは不要でした。


mysqlimport単体で複数ファイルを一括インポートできるようです。

例えばtkhgshデータベースのtestテーブルにインサートするとします。
ファイル名を
data1_1.csv、data1_2.csv、data1_3.csv、data2_1.csv
から
test.data1_1.csv、test.data1_2.csv、test.data1_3.csv、test.data2_1.csv
などとインサートするテーブル名に変えてください。

mysqlimport -L tkhgsh /path/to/test.*

これで一括インポートできます。スクリプトは不要でした。
mysqlの権限やcsvファイルのパーミッションに気を付けてください。
他、オプションやcsvファイルの仕様などはマニュアル見てください。

http://dev.mysql.com/doc/refman/5.1/ja/mysqlimpo …
http://dev.mysql.com/doc/refman/5.1/ja/load-data …

------------

自分が言ったスクリプトというのは、
#!/bin/sh
files="/path/to/csv/*"
for file in ${files}
do
mysqlimport database ${file}
done
で、1ファイルずつmysqlimportすることを考えていました。
これとは別に、最初にファイルをまとめて巨大なファイルを作ってインポートでも可能ですね。
$ cat /path/to/csv/* >test.csv
$ mysqlimport database test.csv

また、回答2、3の人のはcsvをインポートではなく、
csvをinsert文に変えてmysqlに突っ込む方法ですね。
$ mysql database <test.sql でtest.sqlに書かれたsql文をdatabaseに対して発行できます。
csvの中が
A 1
A 2
b 3
などとなっていれば、例えば
insert into test values('A', 1);
insert into test values('A', 2);
insert into test values('B', 3);
などと変えてやり、それで上記の$ mysql database <test.sql でインサートできます。

やり方様々、あります。
mysql、linux、シェルスクリプトの基本の基本から学びなおしてください。
windows環境ならばシェルスクリプトではなくコマンドプロンプトですね。がんばってください。
    • good
    • 0
この回答へのお礼

ありがとうございます!!
Windowsなので、コマンドプロンプトなど見直して見ます。
思ったよりもすっと行きそうなので、安心しました。

また、それ以外でもいろいろ教えていただきありがとうございます。

お礼日時:2013/02/15 17:39

下記のようなバッチ・ファイルを作成して、実行できませんか?



mysql -u napzak -p --default-character-set=utf8 foo_db < dump.sql

300個は大したことないですよ。
ディレクトリが複雑だと面倒ですが、それも事前に別なバッチで前処理すれば解決できますよ。


要は、必要ならPerlなどで前処理を行ってから「mysql -u napzak -p --default-character-set=utf8 foo_db < dump.sql」などのコマンドを実行するようにすれば、起動して完了を待つだけになりますよ。
まぁ~それなりに事前のテストなどは必要ですが ^ ^;
    • good
    • 0
この回答へのお礼

ありがとうございます。

ところで、バッチファイルの中には何を書くのでしょうか?SQLの
LOAD DATA INFILE 文を並べるのでしょうか?

そうだとしたら、このファイル名には変数を利用して、data1.csv~data300.csvを順繰りに指定することは出来るのでしょうか?(今のところMySQLコマンドラインではうまくいかないので・・)

勘違いだったらすみません。どうぞよろしくお願いいたします。

お礼日時:2013/02/15 09:37

CSVがあるなら、ちょっとフォーマットを編集してSQLに直して、普通にインポートするのは駄目ですか?

この回答への補足

ありがとうございます。

ファイルが300個程度あるので、一つ一つインポートという選択肢は避けたいと願っています。

しかも、実はフォルダも分かれていたりするので、繰り返し処理でインポートする以外手はない気がしています。すみません。

補足日時:2013/02/14 16:02
    • good
    • 0

mysql内で完結しないといけないのでしょうか?


スクリプト(シェルスクリプトやコマンドプロンプトのバッチ)とmysqlimportは使えませんか?

この回答への補足

すみません。初心者であまり良くわかっていないところがあると思いますが、お許しください。

最終的に一つのテーブルになるのであれば、MySQLのなかで、完結する必要はありません。

スクリプトとは、テキストに書いておいて、SOURCE コマンドで走らせると言うことですか?
mysqlimportでは、ファイル名に変数が使えるのでしょうか?

どうぞよろしくお願いいたします。

補足日時:2013/02/14 13:30
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す