php高效读取文件并插入sql

时间:2015-08-11 01:28:15

标签: php mysql file

file:data.txt (11617行)

var listItem = $('#menu-selector > li');

$(listItem).click(function() {
  $(listItem).removeClass('js-is-active');
  $(this).toggleClass('js-is-active');

});

$('#home_li').click(function(){
   alert('home clicked')
})

$('#notif_li').click(function(){
   alert('notifs clicked')
})

$('#profile_li').click(function(){
   alert('profile clicked')
})

我只需要2015-06的数据,我使用fget并检查每一行的日期时间,但确实很慢,超过50秒。

   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 

解决方案:不到2秒!!!! (感谢Kevin P.和Dragon)

    $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);
        }
    }

3 个答案:

答案 0 :(得分:2)

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

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

编辑:此外,fgets无法保证为您提供全线。你一次得到4096个字节;如果幸运的话,边界可能位于一行的中间,这会使行不匹配,或者由于错过了假设(例如构造SQL时$line数组的长度)而破坏了代码,如果不 *

*)反之亦然 - 它最好完全打破,这至少是一个明显的错误,大喊大叫固定;而不是静默数据下拉。

答案 1 :(得分:0)

可能会立即在DB中插入多个条目,而不是每次找到所需时间时都调用它?

在这种情况下,它类似于this

答案 2 :(得分:0)

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