2011-06-22 35 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

這很好。爲我節省了很多時間。乾杯 –