Импорт csv в новую таблицу mysql

Частенько бывает нужен скрипт, чтобы из консоли быстро подтянуть csv в базу данных для более комфортной работы.

Большинство распространенных в интернете php-mysql скриптов подразумевают импорт csv файлов в таблицы с заранее известным количеством полей.

Данный скрипт лишен этого недостатка — он считывает из файла первую строку, которая является заголовками полей-колонок, и, перед импортом, создает таблицу с соответствующей структурой. Поля после создания имеют тип varchar(250), и уже потом меняются под конкретные цели и ставятся индексы.

Этот сниппет я использую для работы со списками емейлов. После импорта в базу можно приступать с сравнению с запрет-листами (md5 suppression list) и дальнейшей работе с рассылками.


<?php
error_reporting(E_ERROR | E_WARNING | E_PARSE);
$host = 'localhost';
$user = 'db_user';
$pass = 'db_pass';
$database = 'db_name';

$db = mysql_connect($host, $user, $pass);
mysql_query("use $database", $db);

/********************************************************************************/
// Parameters: filename.csv table_name

$argv = $_SERVER[argv];

if($argv[1]) { $file = $argv[1]; }
else {
echo "Please provide a file name\n"; exit;
}
if($argv[2]) { $table = $argv[2]; }
else {
$table = pathinfo($file);
$table = $table['filename'];
}

/********************************************************************************/
// Get the first row to create the column headings

$fp = fopen($file, 'r');
$frow = fgetcsv($fp);

foreach($frow as $column) {
if($columns) $columns .= ', ';
$columns .= "`$column` varchar(250)";
}

$drop = "drop table if exists $table";
mysql_query($drop, $db);

$create = "create table if not exists $table ($columns);";
mysql_query($create, $db);

/********************************************************************************/
// Import the data into the newly created table.

$file = $_SERVER['PWD'].'/'.$file;
$q = "load data infile '$file' into table $table fields terminated by ',' ENCLOSED by '\"' ignore 1 lines";
mysql_query($q, $db);

?>