3

CSV私は、毎日約 25,000 行のファイルを提供してくれる会社と仕事をしています。CSVある日と前日の違いは、最新のものでは一部の行 (合計よりもはるかに少ない) が削除され、他の行が追加されていることです。したがって、2 つのファイルには約 24900 行が共通しています。

時間内にすべての行を保存する必要があるため、毎日、DB のテーブルを現在の CSV で更新する必要があります。

私は考えます:

<?php
   $fh = fopen($actual_csv, 'r');
   $contents = fread($fh, filesize($actual_csv));
   fclose($fh);
   $fileLines = explode("\n", $contents);
   for ($i = 1; $i < count($fileLines) - 1; $i++) {
    $fieldList = explode(';', $fileLines[$i]);
        //$fieldList[0] is my unique id
        if(mysql_num_rows(mysql_query("SELECT * FROM table_where_i_store_all WHERE id='$fieldList[0]'"))<=0){
           mysql_query("INSERT INTO table_where_i_store_all (column names..) VALUES ('$fieldList[0],........')"); // there are many column so i don't write it..
        }
   }
?>

これはあまり強力で高速ではないと思います。何か良い方法はありますか?ありがとう!!!

4

2 に答える 2

3

フィールドに一意のインデックスを作成しid(すでに行っている可能性があります)、INSERT IGNOREまたはを使用しますINSERT ... ON DUPLICATE KEY UPDATE

于 2012-09-19T08:20:41.783 に答える
1

ALTER TABLE table_where_i_store_all ADD UNIQUE( id );

$fileLines = explode("\n", $contents);
$linemax = count( $fileLines )-1;

if( $linemax < 1 ) // empty file?
  return;

$SQL = "INSERT IGNORE INTO table_where_i_store_all (column_names) VALUES ";

for ($i = 1; $i < $linemax; $i++) {
   $fieldList = explode(';', $fileLines[$i]);
   //$fieldList[0] is my unique id

   $SQL .= "('$fieldList[0],........'),";        
}
$SQL = substr( $SQL, 0, strlen($SQL)-1);  // remove extra comma from end
$res = mysql_query($SQL);
于 2012-09-19T13:04:34.070 に答える