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

使用mysql和php合并和存储多个csv文件的最佳方法,php,mysql,performance,csv,Php,Mysql,Performance,Csv,我在一家公司工作,该公司每天都会给我一个大约25000行的CSV文件。 一天的CSV与前一天的差异在于,在最新的一天中,删除了一些行(许多行比总数少),添加了其他行。因此,这两个文件共有大约24900行 我必须一次存储所有行。。因此,每天我都要用当前的CSV更新数据库中的表 我想到: <?php $fh = fopen($actual_csv, 'r'); $contents = fread($fh, filesize($actual_csv)); fclose($fh)

我在一家公司工作,该公司每天都会给我一个大约25000行的
CSV
文件。 一天的
CSV
与前一天的差异在于,在最新的一天中,删除了一些行(许多行比总数少),添加了其他行。因此,这两个文件共有大约24900行

我必须一次存储所有行。。因此,每天我都要用当前的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..
        }
   }
?>

id
字段上创建唯一索引(可能您已经在中完成了),并使用
INSERT IGNORE
INSERT。。。在重复密钥更新时

更改表TABLE\u where\u i\u store\u all ADD UNIQUE(id)

$fileLines=explode(“\n”,$contents);
$linemax=count($fileLines)-1;
if($linemax<1)//是否为空文件?
返回;
$SQL=“将忽略插入表中,其中存储所有(列名称)值”;
对于($i=1;$i<$linemax;$i++){
$fieldList=explode(“;”,$fileLines[$i]);
//$fieldList[0]是我的唯一id
$SQL.=“(“$fieldList[0],…”),”;
}
$SQL=substr($SQL,0,strlen($SQL)-1);//从末尾删除多余的逗号
$res=mysql\u查询($SQL);

如果前面的文件可用,则处理两个
CSV
文件的差异似乎更有效。你已经在这些行中考虑过了吗?那么你正在谈论将所有内容存储在另一个csv文件中?是的,如果你有昨天的文件,你可以使用csv差异库来获取今天文件与昨天文件的差异。从昨天起,结果将是删除和添加的。您可以对这两个集合采取适当的操作。希望这是清楚的。我喜欢你的建议。。但是在哪里可以找到csv diff php库呢?:)我用谷歌搜索它,但我只找到了代码……如果你能使用Perl模块,那么就会有一些CPAN模块;如果失败了,就跳过。这就是您需要唯一索引或其他约束的原因,如果您尝试添加同一行,这些约束将失败。
$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);