php平均拆分大文件为N个小文件

用PHP程序拆分大文件为N个小文件

/*
假设有文件data.log , 内容如下,行数很多,假设有上亿条数据,文件大小大概在800M左右
92735290
80334472
49114074
87184448
56073913
49869384
41544494
32725219
88143005
41025390
...
50674133
88480834
73630065
84739990
28690490
82888793
32222595
76950683
62781066
69386596

需求是把这个文件平均拆分为N个小文件
0.log
92735290
80334472
49114074
...
87184448
56073913
49869384
41544494

1.log
32725219
88143005
41025390
...
50674133
88480834
73630065
84739990

2.log
28690490
82888793
32222595
...
76950683
62781066
69386596
*/

//废话不多说贴代码
set_time_limit(500);
$file = 'data.log';

//制造1000W的行数据
$handle = fopen($file , 'wb+');
for ($i=0;$i<10000000;$i++)
{
    fwrite($handle , rand(10000000,99999999)."
");
}
fclose($handle);
exit();

//拆分成小文件
$sub_file_count = 100;                                   //要拆分的文件个数
$sub_file_len   = ceil(filesize($file)/$sub_file_count); //每个子文件的大小
$handle         = fopen($file, "rb");                    //打开文件资源
rewind($handle);                                         //文件位置指针设为文件流的开头
$last_n_len = 0;
for ($i=0;$i<$sub_file_count;$i++)
{
    $content        = fread($handle , $sub_file_len + $last_n_len);
    $last_n         = strrchr($content , "
");   //从最后一个
开始一直到末尾的字符串
    $last_n_len     = strlen($last_n);            //从最后一个
开始一直到末尾的字符串的长度
    $trim_n_content = substr($content , 0 , strlen($content) - $last_n_len);
    //写文件
    fwrite(fopen($i.".log", "wb") , $trim_n_content);
    fseek($handle , ftell($handle) - $last_n_len + 1);//设置文件指针
}
exit();

  

——在青春的路上,我们与你携手共进!
原文地址:https://www.cnblogs.com/sajanray/p/4424762.html