33

CSV からデータをインポートしようとして少し問題があり、まだ解決できていないいくつかの質問があります。

まず、全体像を把握するのに役立つコードを次に示します (少し整理して、CSS と DB 接続を削除します)。

<body>
<div id="container">
<div id="form">

<?php
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records
mysql_query($deleterecords);

//Upload File
if (isset($_POST['submit'])) {

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded 
 successfully." . "</h1>";
        echo "<h2>Displaying contents:</h2>";
        readfile($_FILES['filename']['tmp_name']);
    }

    //Import uploaded file to Database
    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $import="INSERT into importing(text,number)values('$data[0]','$data[1]')";

        mysql_query($import) or die(mysql_error());
    }

    fclose($handle);

    print "Import done";

//view upload form
} else {

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";

}

?>

</div>
</div>
</body>

これは基本的に、さまざまな方法を何度も試みた後に見つけた例を適応させたものです。

私の CSV には 2 列のデータがあり、最初の列はテキストで、2 番目は整数です。データベースのテーブルにも 2 つの列があり、最初の列は「テキスト」、2 番目の列は「数値」です。

だから私が持っている質問は次のとおりです。

  1. アップロードされているテキストがすべてのフィールドで 0 と表示されているだけで、理由がわかりません
  2. データが "" で囲まれてしまうという記事を読み続けています。
  3. ヘッダーなどの CSV の最初の X 行を無視するにはどうすればよいですか?
  4. このプロセス全体でデータ形式が変更されていますか?それともグラフで使用する準備ができていますか? たとえば、小数はデータベースに配置されると小数のままになりますか?

これですべてがカバーされると思います。事前に助けてくれてありがとう!

編集:

10,000 レコードのアップロードのテストを行ったところ、次のエラーが発生しました。

「致命的なエラー: 最大実行時間の 30 秒を超えました」

何かご意見は?

4

6 に答える 6

77

先日、ほぼ同じ質問に答えました:CSVファイルをmysqlデータベースに保存する

MySQL には、LOAD DATA INFILEPHP プログラムを介してループで処理する必要なく、単一の SQL クエリで CSV ファイルを直接インポートできる機能があります。

簡単な例:

<?php
$query = <<<eof
    LOAD DATA INFILE '$fileName'
     INTO TABLE tableName
     FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\n'
    (field1,field2,field3,etc)
eof;

$db->query($query);
?>

それはそれと同じくらい簡単です。

ループも大騒ぎもありません。PHPで解析するよりもはるかに高速です。

MySQL のマニュアル ページ: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

それが役立つことを願っています

于 2012-07-12T10:02:01.347 に答える
7
$i=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i>0){
    $import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')";
    mysql_query($import) or die(mysql_error());
}
$i=1;
}
于 2012-07-12T09:01:07.173 に答える
3
set_time_limit(10000);

$con = mysql_connect('127.0.0.1','root','password');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("db", $con);

$fp = fopen("file.csv", "r");

while( !feof($fp) ) {
  if( !$line = fgetcsv($fp, 1000, ';', '"')) {
     continue;
  }

    $importSQL = "INSERT INTO table_name VALUES('".$line[0]."','".$line[1]."','".$line[2]."')";

    mysql_query($importSQL) or die(mysql_error());  

}

fclose($fp);
mysql_close($con);
于 2012-07-12T09:57:20.427 に答える
3

letsay $infile = a.csv //ファイルをインポートする必要があります。

class blah
{
 static public function readJobsFromFile($file)
{            
    if (($handle = fopen($file, "r")) === FALSE) 
    {
        echo "readJobsFromFile: Failed to open file [$file]\n";
        die;
    }

    $header=true;
    $index=0;
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
    {
        // ignore header
        if ($header == true)
        {
            $header = false;
            continue;
        }

        if ($data[0] == '' && $data[1] == '' ) //u have oly 2 fields
        {
            echo "readJobsFromFile: No more input entries\n";
            break;                        
        }            


        $a      = trim($data[0]);
        $b   = trim($data[1]);                 





        if (check_if_exists("SELECT count(*) FROM Db_table WHERE a='$a' AND b='$b'") === true)
        {

                $index++;
            continue;    
        }            

        $sql = "INSERT INTO DB_table SET a='$a' , b='$b' ";
        @mysql_query($sql) or die("readJobsFromFile: " . mysql_error());            
        $index++;
    }

    fclose($handle);        
    return $index; //no. of fields in database.
} 
function
check_if_exists($sql)
{
$result = mysql_query($sql) or die("$sql --" . mysql_error());
if (!$result) {
    $message  = 'check_if_exists::Invalid query: ' . mysql_error() . "\n";
    $message .= 'Query: ' . $sql;
    die($message);
}

$row = mysql_fetch_assoc ($result);
$count = $row['count(*)'];
if ($count > 0)
    return true;
return false;
}

$infile=a.csv; 
blah::readJobsFromFile($infile);
}

お役に立てれば。

于 2012-07-12T09:12:26.710 に答える
0

csv の解析について覚えておくべき主なことは、いくつかの簡単な規則に従うことだと思います。

a) テキスト ファイルなので、簡単に開くことができます b) 各行は行末によって決定されます \n 最初に文字列を行に分割します c) 各行/行にはコンマで決定される列があるため、配列を取得するために各行を分割します列の

この投稿を読んで、私が話していることを確認してください

こつをつかめば、実際には非常に簡単に実行でき、非常に便利になります。

于 2015-01-31T09:48:15.370 に答える