【发布时间】: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/…