在CSV上传时自动构建mySql表

时间:2011-06-22 19:49:43

标签: php mysql csv

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

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


然后它应该在db中构建一个mySql表,它将读取第一行并创建列,然后相应地导入数据。

我知道a similar issue,但由于以下规格,这是不同的。

  • 表的名称应该是文件的名称(减去扩展名[.csv])
  • 每个csv文件可以是不同的
  • 应构建一个包含CSV文件中列数和名称的表
  • 添加第二行和
  • 的数据

这是design sketch

也许有一些已知的框架可以让这很容易。 谢谢。

5 个答案:

答案 0 :(得分:7)

$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);

答案 1 :(得分:4)

也许这个功能会对你有所帮助。

  

fgetcsv

     

(PHP 4,PHP 5)

     

fgetcsv - 从文件指针获取行   并解析CSV字段

http://php.net/manual/en/function.fgetcsv.php

答案 2 :(得分:3)

http://bytes.com/topic/mysql/answers/746696-create-mysql-table-field-headings-line-csv-file有一个如何做到这一点的好例子。

第二个例子应该让你走上正轨,没有一些自动的方法可以做到这一点所以你需要做一个lil编程但是一旦你把这个代码作为一个开始实现它应该不会太难点。

答案 3 :(得分:1)

构建表是一个与任何其他表一样的查询,从理论上讲,您可以从csv文件的第一行获取列的名称。

然而,有一些实际问题:

  • 您如何知道某列的数据类型是什么?
  • 你怎么知道索引是什么?
  • 您如何从表中获取数据/您如何知道哪些列代表什么?

由于您无法将新表与其他任何内容联系起来,因此您可能会破坏关系数据库的用途,因此您可以保留并使用csv文件。

答案 4 :(得分:1)

您所描述的内容听起来像ETL工具。也许Google for MySQL ETL工具......你将不得不决定你想要的操作系统和风格。

或者只写自己的......