2012-04-22 5 views
1

私は多くを検索したが、まだ答えを見つけることができなかったものをあなたの助けにしたいと思います。 質問のタイトルとして、私は列のデータ型を知らないmySqlデータベースにテーブルを作成しようとしています。基本的に、私はcsvファイルからデータベースに新しいテーブルを作成するためにPHPを使用します。最初の行には列名が含まれています。私は、csvファイルを選択して最初の行を使用してテーブルの列名を生成することができ、各列のデータ型を指定する必要がないphpMyAdminでこれを確認したので、これを行うことができることを知っています。mySql:わかりやすいデータ型のテーブルを作成するには?

$databaseName="myDatabase"; 
mysql_connect("localhost","xxxxxx","xxxxxxxx"); 
mysql_select_db($databaseName); 


for($i = 0; $i < count($newFiles); $i++){//traverse the table that contains the file names 
     $content = file($newFileLocation.$newFiles[$i]); 

     //First line: $content[0]; 
     $firstLine=$content[0];//save first line which are the column names 
     //echo $firstLine; 
     $tableName= str_replace('.txt','', $newFiles[$i]);//remove the .txt to use for table name 
     //echo $tableName."\n"; 

     echo "\n\ncreating tables\n\n"; 
     /*mysql_query("load data local infile '$newFiles[$i]' 
       into table $tableName 
        fields terminated by ',' 
        lines terminated by '\n' 
        ($firstLine) "); */ 


     mysql_close(); 
} 

答えて

0

ここに問題の解決方法があります。最初に、ファイルの最初の行を取得してcolsの名前を保存します(テーブルを作成する方法を知るため)。それを文字列に保存してから、カンマ文字に基づいて文字列を区切ります。 その後、値を含むファイルの2行目をとります。その行を文字列に格納し、その文字列をカンマ文字に基づいて異なる値に分割します。これを使用して各列のタイプを識別します。

これはコードです。

$databaseName="myDatabase"; 
mysql_connect("localhost","xxxxxx","xxxxxxxx"); 
mysql_select_db($databaseName); 


for($k = 0; $k < count($newFiles); $k++){//traverse the table that contains the file names 
      $content = file($newFileLocation.$newFiles[$k]); 

      //First line: $content[0]; 
      $firstLine=$content[0]; 
      $secondLine=$content[1]; 
      //echo $firstLine."\n"; 
      $firstLine = str_replace("\r\n",'',$firstLine); 
      $colNames=explode(',',$firstLine); 
      $fieldList = explode(',',$secondLine); 

      $dataType=""; 
      for($i = 0; $i < count($fieldList); $i++){ 
       if (is_numeric($fieldList[$i])){ 
         if (strpos($fieldList[$i],'.') == false){ 
          $fieldList[$i] = (int)$fieldList[$i]; 
         }else{ 
          $fieldList[$i] = (float)$fieldList[$i]; 
         } 
        } 

       switch(gettype($fieldList[$i])) { 
         case 'integer': 
          $typeInfo = 'int(11)'; 
          break; 
         case 'float': 
         case 'double': 
           $typeInfo = 'float'; 
           break; 

         case 'string': 
           $typeInfo = 'varchar(80)'; 
          break; 
         default: 
           $typeInfo = 'varchar(80)'; 
           break; 
         } 

       if(gettype($fieldList[$i]) != NULL) { 
        $dataType= $dataType.'`'.$colNames[$i].'` '." ".$typeInfo.' NOT NULL'; 
        if(($i)!=count($fieldList)-1){ 
         $dataType= $dataType.","; 
        } 
       } 
      } //end of for loop 


      $tableName= str_replace('.txt','', $newFiles[$k]); 
      //echo $tableName."\n"; 

      // 
       //echo "\n".$dataType."\n"; 
       $succ=mysql_query("CREATE TABLE `$tableName` ($dataType)"); 
       if($succ) 
        echo "Table ".$tableName." was created Succesfully \n"; 

       //echo $databaseName; 

       $loadsql = 'LOAD DATA LOCAL INFILE "'.$newFileLocation.$newFiles[$k].'" INTO TABLE `'.$tableName.'` FIELDS TERMINATED BY "," IGNORE 1 LINES ('.$firstLine.')'; 
       mysql_query($loadsql);  




     }//end of for loop 


    mysql_close(); 
1

のMySQLには「不明」のデータ型が(多分BLOB型がそれに最も類似している)ありません:これまでのところ、これは私のPHPコードです。

テーブルフィールドを名前からのみ自動的に定義する必要があり、そこに格納されるデータの種類がわからない場合は、BLOBまたはテキストとして作成し、値を格納するときはそこから作成されたテキスト表現を作成しますヘッダーとしての実際のタイプに値のテキスト表現を加えたものです。

または、それはまったく必要ありません。 Using PHP to take the first line of a CSV file and create a MySQL Table with the dataをチェックして、そこに応答があるかもしれません。

+0

こんにちは、それは間違いなく動作します。リンクありがとう。それは本当に助けになりました。私はそのリンクに基づいてソリューションを投稿します –

関連する問題