2011-06-22 34 views
4

在一个CSV文件上传自动建立MySQL表。自动建立在CSV MySQL表上传

我有一个管理部分,在那里管理员可以上传CSV文件适用于不同的列数,不同的列名。


它应该然后将读取的第一线和创建列,然后相应地导入数据的DB构建一个MySQL表。

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

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

这里是一个design sketch

也许有一些已知的框架可以使这一切变得简单。 谢谢。

+0

为什么要这样?你打算如何使用这些数据? – Sjoerd

+0

@Sjoerd,我更新了问题并添加了设计草图,希望有所帮助。 – adardesign

回答

1

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

不过,也有一些现实问题:

  • 你怎么会知道某列数据是什么类型?
  • 你怎么知道索引是什么?
  • 你会如何取出数据表中的/你怎么会知道是什么柱代表着什么?

因为你不能将新表与其他任何东西联系起来,所以你有点违背了关系数据库的目的,所以你不妨保留并使用csv文件。

+0

所有列都将具有VARCHAR数据类型,我希望我上传的草图将帮助您更好地理解问题。 – adardesign

1

你描述的是什么样的ETL工具的声音。也许谷歌的MySQL的ETL工具...你将不得不决定你想要的操作系统和风格。

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

+0

mclintock谢谢,请参阅更新的问题,我添加了设计草图,希望这有助于。 – adardesign

6
$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); 
+0

这很好。为我节省了很多时间。干杯 –