php - 从 Excel CSV 文件动态创建 MySQL 表

标签 php mysql excel

我的目标是创建一个包含来 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/

相关文章:

http - php-fpm 每天停止多次

javascript - 如何逐行读取并仅返回数字大于 0.0 的行

php - 如何插入两个表

mysql - 如何在 Excel 中自动执行 SQL 脚本

php - 编码并从 mysql 数据库中提取

php - 自动下载并安装一个exe文件

mysql - 如何在同一 View 中排除基于相等值的行数据?

PHP Zend 与 AWS ElastiCache

excel - Office 2016 中的 MailItem.GetInspector.WordEditor 生成应用程序定义或对象定义的错误

excel - 碧 Jade 报告 : footer field in xls participate in sorting