2011-06-22 12 views
4

CSVファイルのアップロード時に自動的にmySqlテーブルを構築します。CSVアップロード時に自動的にmySqlテーブルを構築します

管理者セクションでは、管理者が異なる列数と異なる列名のCSVファイルをアップロードできるようになりました。


データベースにmySqlテーブルを作成して、最初の行を読み込んで列を作成し、それに応じてデータをインポートする必要があります。

私はa similar issueを認識していますが、これは以下の仕様のために異なります。表の名前は、ファイルの名前でなければならない

  • (マイナス拡張[.CSV])
  • 各CSVファイルは、
  • 切り抜いできる列および名前の数にテーブルを構築する必要がありますCSVは
  • 2行目からデータを追加し、ここで

design sketch

されたファイルおそらくこれを簡単にする既知のフレームワークがあります。おかげさまで

+0

なぜこれが必要ですか?どのようにデータを使用しますか? – Sjoerd

+0

@Sjoerd、私は質問を更新し、デザインスケッチを追加しました。 – adardesign

答えて

4

多分、この機能が役に立ちます。

fgetcsv

(PHP 4、PHP 5)

fgetcsv - テーブルを構築ファイルポインタ からラインを取得し、CSVフィールド

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

1

ために解析されます理論的には、他のどのようなクエリでも、列の名前を最初の行から得ることができますCSVファイル。

しかし、いくつかの実用的な問題があります

  • はどのようにして、特定の列が何であるかをデータタイプを知っているだろうか?
  • インデックスは何ですか?
  • テーブルからデータをどのように取得しますか/どのような列が何を表しているかをどのように知っていますか?

新しいテーブルを他のものに関連付けることはできないので、あなたはリレーショナルデータベースの目的を破っているので、csvファイルをそのまま使用してください。

+0

すべての列はVARCHARデータ型を持ちます。アップロードしたスケッチが、より良い質問を理解するのに役立つことを願っています。 – adardesign

1

説明していることは、ETLツールのように聞こえます。おそらくGoogleのMySQL ETLツールのためのGoogle ...あなたは、あなたが望むOSとスタイルを決める必要があるでしょう。

それとも、あなた自身を書き...

+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

これは良いです。私に多くの時間を救った。乾杯 –

関連する問題