使用mysql和php合并和存储多个csv文件的最佳方法

时间:2012-09-19 08:16:59

标签: php mysql performance csv

我正在与一家公司合作,每天都会给我一个大约25.000行的CSV文件。 一天的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.. } } ?> 之间的差异在于,在最新的一行中,删除了一些行(少于总数)并且添加了其他行。因此这两个文件共有大约24900行。

我必须在时间中存储所有行..所以每天我都要使用当前的CSV更新数据库中的表。

我想:

{{1}}

我认为这不是非常强大和快速。有没有更好的方法?感谢!!!

2 个答案:

答案 0 :(得分:3)

id字段上创建唯一索引(可能您已经完成)并使用INSERT IGNOREINSERT ... ON DUPLICATE KEY UPDATE

答案 1 :(得分: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);