php高效读取文件并插入sql


php efficient read file and insert sql

文件:data.txt(11617行(

   user  datetime
   23   2015-03-01 08:04:15 
   15   2015-05-01 08:05:20 
  105   2015-05-01 08:07:10 
   15   2015-06-01 08:08:29 
  105   2015-06-01 08:12:48 

我只需要2015-06年的数据,我使用fget检查每一行的日期时间,但速度非常慢,超过50秒。

    $d='data.txt';
    import($d);
    function import($d){
        $handle = fopen($d, "r") or die("Couldn't get handle");
        if ($handle) {
            while (!feof($handle)) {
                $buffer = fgets($handle, 4096);
                $line=explode("'t",$buffer);
                if(date("Y-m",strtotime($line[1])=="2015-06"){
                   mysql_query("INSERT INTO `table` ....");
                }
                else{
                   //break? when month>6
                }
            }
            fclose($handle);
        }
    }

解决方案:小于2s!!!!(感谢Kevin P.和Dragon(

            if(substr($line[1],0,7)=="2015-06"){
               $sql.=empty($sql)?"":","."(`".$line[1]."`.........)";
            }
            elseif(substr($line[1],0,7)>"2015-06"){
               break;// when month>6
            }
            mysql_query("INSERT INTO `table` ....".$sql);

没办法,使用比PHP更快的东西。例如,您可以使用grepawk来读取文件并快速过滤它。例如:

$lines = explode("'n", `awk '$2 ~ /^2015-06/ { print }' data.txt`);

编辑:此外,fgets不能保证给你完整的线路。您一次获得4096个字节;边界可能在一行的中间,如果幸运的话,这将使该行不匹配,或者如果不匹配,则由于遗漏的假设(例如构造SQL时$line数组的长度(而破坏代码*


*(反之亦然——最好是完全断裂,这至少是一个明显的错误,需要修复;与静默数据丢弃相反

也许一次向数据库中插入多个条目,而不是每次找到所需的时间都调用它?

在这种情况下,它与类似

也许您应该使用grep来过滤掉不需要的行。