从Excel CSV文件动态创建MySQL表

时间:2015-09-24 21:55:00

标签: php mysql excel

我的目标是创建一个包含CSV文件数据的MySQL表。 我知道如何创建一个MySQL表以及如何从excel中加载数据。

但问题是: 我有一个包含长列名称的大型CSV文件(例如问题标签" Q27:您对售后服务感到满意吗?")因此通过复制所有列名创建MySQL表会很无聊(差不多35)并添加' VARCHAR(100)NOT NULL'。

这就是为什么我想通过获取文件的第一行来编写一个小的PHP脚本来创建MySQL表,然后用其余的csv文件数据填充它。

目前,我的脚本如下所示:

<?php

$host = 'localhost';
$user = 'root';
$pass = '';
$database = 'test';

$db = @mysql_connect($host, $user, $pass) or die('mysql connection pb');
@mysql_select_db($database) or die('database selection pb');
/********************************************************************************/
// 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 {
    echo "Please provide a table name\n";
    $table = pathinfo($file);
    $table = $table['filename'];
}

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

$fp = fopen($file, 'r');
$frow = fgetcsv($fp,";");
$columns=false;
print_r($frow);
foreach($frow as $column) {
    if($columns) $columns .= ', ';
    $columns .= "`$column` VARCHAR(250) NOT NULL";
}
$create = "create table if not exists $table ($columns);";
@mysql_query($create, $db) or die('table creation pb');

/****************************************************************************    ****/
// Import the data into the newly created table.
$file = addslashes(realpath(dirname(__FILE__)).'\\'.$file);

$q = "load data infile '$file' into table $table fields terminated by ',' ignore 1 lines";
@mysql_query($q, $db);

?>

当我在命令行中运行:php myscript.php csvfile.csv mytable时,问题出现在表创建查询中。 最重要的是,即使它们被&#34;;&#34;分隔,列名也不能很好地识别。在csv。

1 个答案:

答案 0 :(得分:2)

如上所述,请不要使用自PHP 7(当前版本)起的mysql_函数,此扩展程序不再可用。使用mysqli或PDO。

以下是包含try/catch的PDO示例(比die()更具信息性)。此外,csv读取处理略有不同,它在SQL中连接创建表字符串。

<?php

$host="localhost"; 
$username="root"; 
$password="password"; 
$database="test"

// 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 {
   echo "Please provide a table name\n"; 
   $table = pathinfo($file); 
   $table = $table['filename'];
}

// Read in only first row of CSV file
$handle = fopen($file, "r");

$row = 1; 
$columns = [];

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE AND $row==1) {
   $columns = $data;
   $row++; 
}

//SQL string commands
$createSQL = "CREATE TABLE IF NOT EXISTS $table 
              (".implode(" VARCHAR(255) NOT NULL, ", $columns). " 
               VARCHAR(255) NOT NULL);";

$file = addslashes(realpath(dirname(__FILE__)).'\\'.$file);
$loadSQL = "LOAD DATA INFILE '$file' 
            INTO TABLE $table 
            FIELDS TERMINATED BY ',' 
            IGNORE 1 LINES";

// Open database connection 
try { 
   $dbh = new PDO("mysql:host=$host;dbname=$database",$username,$password); 
   $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

   // Execute queries
   $S1TH = $dbh->query($createSQL); 
   $S2TH = $dbh->query($loadSQL);   
} 

catch(PDOException $e) { 
   echo $e->getMessage(); 
}

# Close database connection 
$dbh = null;

?>