3

我正在与一家公司合作,该公司每天都会给我一个CSV大约 25.000 行的文件。前一天与前一天的区别在于CSV,在最新的一天中,一些行(比总数少很多)被删除,而另一些则被添加。所以这两个文件共有大约 24900 行。

我必须及时存储所有行。所以每天我都必须用当前的 CSV 更新我在 DB 中的表。

我想想:

<?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 IGNOREINSERT ... ON DUPLICATE KEY UPDATE

于 2012-09-19T08:20:41.783 回答
1

ALTER TABLE table_where_i_store_all 添加唯一(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 回答