【问题标题】:Create MySQL table dynamically from Excel CSV file从 Excel CSV 文件动态创建 MySQL 表
【发布时间】:2015-09-28 10:00:58
【问题描述】:

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

但问题是: 我有一个包含长列名的大型 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 之外,您是否考虑过其他选项?看来您需要的是数据集成工具(我这么说是因为您正在处理 large csv 文件)而不是 php 脚本。话虽如此,请将抛出的php错误添加到您的问题中
  • @luchosrock ,我想使用 php,因为在我的表将在 mysql 中创建之后,我想发送查询并绘制带有 jpgraph 扩展名的图形,这就是为什么我打算在 php 中编写 evrything。
  • @HawasKaPujaari,请问这里不推荐使用的功能在哪里?
  • @AdriL。 mysql_* 函数由于与它的使用相关的许多安全问题而被弃用。请看stackoverflow.com/questions/12859942/…

标签: php mysql excel


【解决方案1】:

如前所述,不要使用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;

?>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 2018-04-14
    • 2013-06-12
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多