我的目标是创建一个包含来 self 的 CSV 文件的数据的 MySQL 表。 我知道如何创建 MySQL 表以及如何从其中加载 excel 数据。
但问题是: 我有一个包含长列名的大型 CSV 文件(问题标签例如“Q27:您对售后服务满意吗?”)所以通过复制所有列名(将近 35 个)并添加来创建 MySQL 表会很无聊'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,问题似乎出在表创建查询中。 最重要的是,即使列名由“;”分隔,也无法很好地识别它们。在 csv 中。
最佳答案
如前所述,避免使用 mysql_
函数,从 PHP 7(当前版本)开始,此扩展不再可用。使用 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;
?>
关于php - 从 Excel CSV 文件动态创建 MySQL 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32771556/