Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CSV上传后自动构建mySql表_Php_Mysql_Csv - Fatal编程技术网

Php CSV上传后自动构建mySql表

Php CSV上传后自动构建mySql表,php,mysql,csv,Php,Mysql,Csv,在CSV文件上传后自动构建mySql表 我有一个管理员部分,管理员可以上传不同列数和不同列名的CSV文件 然后它应该在数据库中构建一个mySql表,该表将读取第一行并创建列,然后相应地导入数据 我知道,但这是不同的,因为以下规格 表名应为文件名(减去扩展名[.csv]) 每个csv文件可以是不同的 应使用CSV文件中的列数和名称构建一个表 添加第二行和上的数据 这是一个 也许有一些已知的框架可以让这变得简单。 谢谢 也许这个功能会对您有所帮助 fgetcsv (菲律宾比索4,菲律宾比索5)

在CSV文件上传后自动构建mySql表

我有一个管理员部分,管理员可以上传不同列数和不同列名的CSV文件


然后它应该在数据库中构建一个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数据类型,我希望我上传的草图能帮助你更好地理解问题.那正是我要找的.谢谢!