MySQLデータベースに複数のcsvファイルを同時にインポートする方法はありますか?ある種のバッチインポート?
MAMPサーバーを実行しているMac OSXを使用しています。
MySQLテーブルにインポートする必要がある185個のcsvファイルがあります。 phpMyAdminのインポートタブを使用して個別にインポートできますが、時間がかかります。より良い方法があるかどうか誰かが知っていますか?
次のようなシェルスクリプトを使用します。
#!/usr/bin/env bash
cd yourdirectory
for f in *.csv
do
mysql -e "USE yourDatabase LOAD DATA LOCAL INFILE '"$f"'INTO TABLE yourtable"
done
小さなPHPスクリプトがあなたのためにあります:
#!/usr/bin/php
<?
mysql_connect('localhost','root','root'); // MAMP defaults
mysql_select_db('yourdatabase');
$files = glob('*.csv');
foreach($files as $file){
mysql_query("LOAD DATA INFILE '".$file."' INTO TABLE yourtable");
}
ドキュメントに適合する LOAD DATA INFILE オプションについては、MySQLマニュアルを参照してください。
シェルスクリプトを使用してファイルをループできます(これは、ファイルが現在のディレクトリにあると想定しています)。
#!/bin/bash
for f in *.csv
do
mysql -e "load data infile '"$f"' into table my_table" -u username --password=your_password my_database
done
Windowsユーザーの場合、このバッチを使用します
echo off
setlocal enabledelayedexpansion
FOR %%f IN ("*.csv") DO (
set old=%%~dpnxf
set new=!old:\=\\!
mysql -e "load data local infile '"!new!"' IGNORE into table email_us.business COLUMNS TERMINATED BY ','" -u root
echo %%~nxf DONE
)
d
(ドライブ文字)、p
(ファイルへのパス)、n
(ファイル名)、x
(拡張子)、fはファイル変数手順:-複数のcsvファイルがすべて存在するディレクトリにそのバッチファイルを置き、something.batという名前を付けます。管理者としてcmd.exeを実行し、something.batファイルを呼び出してインポートをお楽しみください...
トムのスクリプトを修正して、直面したいくつかの問題を解決しました
#!/bin/bash
for f in *.csv
do
mysql -e "load data local infile '"$f"' into table myTable fields TERMINATED BY ',' LINES TERMINATED BY '\n'" -u myUser--password=myPassword fmeter --local-infile
done
load data local infile
の代わりに load data infile
:[ロードされるファイルはmysqlサーバーのローカルでした]--local-infile
クライアントでローカルデータロードモードを有効にします。次のシェルスクリプトを使用:
for file in /directory/*.csv
do
echo "Importing file $file"
chown mysql $file
mysql Fortinet -u user -p'password' <<EOF
LOAD DATA LOCAL INFILE '$file'
IGNORE
INTO TABLE tablename
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
EOF
echo "Completed importing '"$file"' "
done
使用したい@hlosukwakha mysqlimport
。これは、ファイルのような名前のテーブルを検索します。使用する mysqlimport -help
は正しいパラメータを見つけますが、基本的にはmysql
と同じです
多くのCSVファイルで同じタスクを実行し、CSVで1つのテーブルを作成したので、XAMPのローカルで使用するスクリプトを次に示します。
<?php
ini_set('display_errors',1);
echo '### Begin Importation<br>';
$mysqli = new mysqli(
"localhost",
"root",
"",
"mydatabase",
3306
);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$files = glob('C:\\xampp\\mysql\\data\\mev2\\*.csv');
foreach($files as $file){
//clean names if needed
$filename = explode('\\',$file);
$filename2clean = str_replace('.csv','', $filename[5]);//because my file is under 5 folders on my PC
$n = strtolower(str_replace('fileprefix_','', filename2clean));
echo '<br>Create table <b>'.$n.'</b><hr>';
$sql = "CREATE TABLE IF NOT EXISTS `mydatabase`.`".$n."` (`email` varchar(60), `lastname` varchar(60), `firstname` varchar(60), `country` varchar(19)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;";
if (!($stmt = $mysqli->query($sql))) {
echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
};
echo '<br>Import data from <b>'.$n.'</b><hr>';
$sql = "LOAD DATA INFILE '".basename($file)."' INTO TABLE `mydatabase`.`".$n."`
FIELDS TERMINATED BY ';'
LINES TERMINATED BY '\r'
IGNORE 1 LINES";
if (!($stmt = $mysqli->query($sql))) {
echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
};
}
echo '### Import finished !<br>';
pythonでは、 d6tstack を使用してこれを簡単にすることができます
import d6tstack
import glob
c = d6tstack.combine_csv.CombinerCSV(glob.glob('*.csv'))
c.to_mysql_combine('mysql+mysqlconnector://usr:pwd@localhost/db', 'tablename')
データスキーマの変更 も処理し、テーブルを作成して、データを前処理できます。