在CSV文件上传时自动构建mySql表。
我有一个管理部分,管理员可以上传包含不同列数和不同列名的CSV文件。
然后它应该在db中构建一个mySql表,它将读取第一行并创建列,然后相应地导入数据。
我知道a similar issue,但由于以下规格,这是不同的。
也许有一些已知的框架可以让这很容易。 谢谢。
答案 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字段
答案 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工具......你将不得不决定你想要的操作系统和风格。
或者只写自己的......