我的目标是创建一个包含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。
答案 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;
?>