Php CSV上传后自动构建mySql表
在CSV文件上传后自动构建mySql表 我有一个管理员部分,管理员可以上传不同列数和不同列名的CSV文件Php CSV上传后自动构建mySql表,php,mysql,csv,Php,Mysql,Csv,在CSV文件上传后自动构建mySql表 我有一个管理员部分,管理员可以上传不同列数和不同列名的CSV文件 然后它应该在数据库中构建一个mySql表,该表将读取第一行并创建列,然后相应地导入数据 我知道,但这是不同的,因为以下规格 表名应为文件名(减去扩展名[.csv]) 每个csv文件可以是不同的 应使用CSV文件中的列数和名称构建一个表 添加第二行和上的数据 这是一个 也许有一些已知的框架可以让这变得简单。 谢谢 也许这个功能会对您有所帮助 fgetcsv (菲律宾比索4,菲律宾比索5)
然后它应该在数据库中构建一个mySql表,该表将读取第一行并创建列,然后相应地导入数据 我知道,但这是不同的,因为以下规格
- 表名应为文件名(减去扩展名[.csv])
- 每个csv文件可以是不同的
- 应使用CSV文件中的列数和名称构建一个表
- 添加第二行和上的数据
谢谢 也许这个功能会对您有所帮助 fgetcsv (菲律宾比索4,菲律宾比索5) fgetcsv-从文件指针获取行 并解析CSV字段
与其他任何查询一样,构建表也是一个查询,理论上,您可以从csv文件的第一行获取列的名称 但是,也存在一些实际问题:
- 您如何知道某个列的数据类型
- 你怎么知道索引是什么
- 如何从表中获取数据/如何知道哪列代表什么
由于您无法将新表与其他任何内容关联,因此您有点违背了关系数据库的用途,因此您最好保留并使用csv文件。您所描述的内容听起来像是一个ETL工具。也许谷歌的MySQL ETL工具…你将不得不决定你想要什么操作系统和风格 或者写你自己的…有一个很好的例子说明了如何做到这一点 第二个例子应该让您走上正确的道路,没有自动的方法来完成,因此您需要进行lil编程,但一旦您实现了该代码作为起点,它就不会太难了。
$file='filename.csv';
$file = 'filename.csv';
$table = 'table_name';
// get structure from csv and insert db
ini_set('auto_detect_line_endings',TRUE);
$handle = fopen($file,'r');
// first row, structure
if ( ($data = fgetcsv($handle) ) === FALSE ) {
echo "Cannot read from csv $file";die();
}
$fields = array();
$field_count = 0;
for($i=0;$i<count($data); $i++) {
$f = strtolower(trim($data[$i]));
if ($f) {
// normalize the field name, strip to 20 chars if too long
$f = substr(preg_replace ('/[^0-9a-z]/', '_', $f), 0, 20);
$field_count++;
$fields[] = $f.' VARCHAR(50)';
}
}
$sql = "CREATE TABLE $table (" . implode(', ', $fields) . ')';
echo $sql . "<br /><br />";
// $db->query($sql);
while ( ($data = fgetcsv($handle) ) !== FALSE ) {
$fields = array();
for($i=0;$i<$field_count; $i++) {
$fields[] = '\''.addslashes($data[$i]).'\'';
}
$sql = "Insert into $table values(" . implode(', ', $fields) . ')';
echo $sql;
// $db->query($sql);
}
fclose($handle);
ini_set('auto_detect_line_endings',FALSE);
$table='table_name';
//从csv获取结构并插入数据库
ini设置(“自动检测线结束”,TRUE);
$handle=fopen($file,'r');
//第一排,结构
if(($data=fgetcsv($handle))==FALSE){
echo“无法从csv$文件中读取”;die();
}
$fields=array();
$field\u count=0;
对于($i=0;$iquery($sql);
while(($data=fgetcsv($handle))!==FALSE){
$fields=array();
对于($i=0;$iquery($sql);
}
fclose($handle);
ini设置(“自动检测行结束”,FALSE);
你为什么要这样做?你打算如何使用数据?@Sjoerd,我更新了问题并添加了设计草图,希望有帮助。mclintock谢谢,请参阅更新的问题,我在其中添加了设计草图,希望这有帮助。所有专栏都会有VARCHAR数据类型,我希望我上传的草图能帮助你更好地理解问题.那正是我要找的.谢谢!