1

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

これまでのところ、これは私のphpコードです:

$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();
}
4

2 に答える 2

1

MySQLには「不明な」データ型はありません(おそらくblob型はそれに最も似ています)。

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

あるいは、それはまったく必要ないかもしれません。[ PHPを使用してCSVファイルの最初の行を取得し、データを使用してMySQLテーブルを作成する]をオンにすると、そこに応答が見つかる可能性があります。

于 2012-04-22T12:01:15.563 に答える
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();
于 2012-04-22T17:36:02.453 に答える