Разделить текстовый файл в PHP

Как я могу разделить большой текстовый файл на отдельные файлы по количеству символов, используя PHP? Таким образом, файл размером 10 000 символов, каждый 1000 символов, будет разделен на 10 файлов. Кроме того, можно разделить только после того, как будет найдена полная остановка?

Благодарю.

ОБНОВЛЕНИЕ 1: Мне нравится код зомбатов, и я удалил некоторые ошибки и придумал следующее, но кто-нибудь знает, как расколоться только после полной остановки?

$i = 1; $fp = fopen("test.txt", "r"); while(! feof($fp)) { $contents = fread($fp,1000); file_put_contents('new_file_'.$i.'.txt', $contents); $i++; } 

ОБНОВЛЕНИЕ 2: я принял предложение зомбатов и изменил код ниже, и, похоже, он работает –

 $i = 1; $fp = fopen("test.txt", "r"); while(! feof($fp)) { $contents = fread($fp,20000); $contents .= stream_get_line($fp,1000,"."); $contents .="."; file_put_contents("Split/".$tname."/"."new_file_".$i.".txt", $contents); $i++; } 

Вы должны сделать это легко с помощью базового fread () . Вы можете указать, сколько байтов вы хотите прочитать, поэтому тривиально читать в точном количестве и выводить его в новый файл.

Попробуйте что-то вроде этого:

 $i = 1; $fp = fopen("test.txt",'r'); while(! feof($fp)) { $contents = fread($fp,1000); file_put_contents('new_file_'.$i.'.txt',$contents); $i++; } 

РЕДАКТИРОВАТЬ

Если вы хотите остановиться после определенного количества длины или на определенном символе , вы можете использовать stream_get_line () вместо fread() . Это почти идентично, за исключением того, что вы можете указать любой конечный разделитель, который вы хотите. Обратите внимание, что он не возвращает делиметр как часть прочитанного.

 $contents = stream_get_line($fp,1000,"."); 

В функции запуска есть ошибка; переменная $split не определена.

Самый простой способ – прочитать содержимое файла, разделить содержимое, а затем сохранить на два других файла. Если ваши файлы составляют более нескольких гигабайт, у вас возникнет проблема с этим в PHP из-за ограничений размера целого числа.

Вы также можете написать класс, чтобы сделать это за вас.

 <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $i=0; $j=1; $date = date("mdy"); unset($buffer); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $split) { $fname = $this->Getpath()."part.$date.$j.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } fclose ($handle); } } ?> Usage Example <?php /** * Sample usage of the filesplit class * * @package filesplit * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:14:06 - usage.php * @access public **/ require_once("filesplit.class.php"); $s = new filesplit; /* $s->Setsource("logs.txt"); $s->Setpath("logs/"); $s->Setlines(100); //number of lines that each new file will have after the split. */ $s->configure("logs.txt", "logs/", 2000); $s->run(); ?> с <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $i=0; $j=1; $date = date("mdy"); unset($buffer); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $split) { $fname = $this->Getpath()."part.$date.$j.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } fclose ($handle); } } ?> Usage Example <?php /** * Sample usage of the filesplit class * * @package filesplit * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:14:06 - usage.php * @access public **/ require_once("filesplit.class.php"); $s = new filesplit; /* $s->Setsource("logs.txt"); $s->Setpath("logs/"); $s->Setlines(100); //number of lines that each new file will have after the split. */ $s->configure("logs.txt", "logs/", 2000); $s->run(); ?> с <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $i=0; $j=1; $date = date("mdy"); unset($buffer); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $split) { $fname = $this->Getpath()."part.$date.$j.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } fclose ($handle); } } ?> Usage Example <?php /** * Sample usage of the filesplit class * * @package filesplit * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:14:06 - usage.php * @access public **/ require_once("filesplit.class.php"); $s = new filesplit; /* $s->Setsource("logs.txt"); $s->Setpath("logs/"); $s->Setlines(100); //number of lines that each new file will have after the split. */ $s->configure("logs.txt", "logs/", 2000); $s->run(); ?> 

Источник http://www.weberdev.com/get_example-3894.html

У меня был класс исправления и работа с файлом .txt.

 <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $buffer = ''; $i=0; $j=1; $date = date("mdy"); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $this->getLines()) { // set your filename pattern here. $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } if ( !empty($buffer) && !empty($i) ) { $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); unset($buffer,$i); } fclose ($handle); } } ?> с <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $buffer = ''; $i=0; $j=1; $date = date("mdy"); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $this->getLines()) { // set your filename pattern here. $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } if ( !empty($buffer) && !empty($i) ) { $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); unset($buffer,$i); } fclose ($handle); } } ?> с <?php /** * filesplit class : Split big text files in multiple files * * @package * @author Ben Yacoub Hatem <hatem@php.net> * @copyright Copyright (c) 2004 * @version $Id$ - 29/05/2004 09:02:10 - filesplit.class.php * @access public **/ class filesplit{ /** * Constructor * @access protected */ function filesplit(){ } /** * File to split * @access private * @var string **/ var $_source = 'logs.txt'; /** * * @access public * @return string **/ function Getsource(){ return $this->_source; } /** * * @access public * @return void **/ function Setsource($newValue){ $this->_source = $newValue; } /** * how much lines per file * @access private * @var integer **/ var $_lines = 1000; /** * * @access public * @return integer **/ function Getlines(){ return $this->_lines; } /** * * @access public * @return void **/ function Setlines($newValue){ $this->_lines = $newValue; } /** * Folder to create splitted files with trail slash at end * @access private * @var string **/ var $_path = 'logs/'; /** * * @access public * @return string **/ function Getpath(){ return $this->_path; } /** * * @access public * @return void **/ function Setpath($newValue){ $this->_path = $newValue; } /** * Configure the class * @access public * @return void **/ function configure($source = "",$path = "",$lines = ""){ if ($source != "") { $this->Setsource($source); } if ($path!="") { $this->Setpath($path); } if ($lines!="") { $this->Setlines($lines); } } /** * * @access public * @return void **/ function run(){ $buffer = ''; $i=0; $j=1; $date = date("mdy"); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $this->getLines()) { // set your filename pattern here. $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } if ( !empty($buffer) && !empty($i) ) { $fname = $this->Getpath()."split_{$j}.txt"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); unset($buffer,$i); } fclose ($handle); } } ?> 

Пример использования

 <?php require_once("filesplit.class.php"); $s = new filesplit; $s->Setsource("logs.txt"); $s->Setpath("logs/"); $s->Setlines(100); //number of lines that each new file will have after the split. //$s->configure("logs.txt", "logs/", 2000); $s->run(); ?> 

В функции запуска я выполнил следующие настройки, чтобы зафиксировать предупреждение «split is not defined».

 function run(){ $buffer=''; $i=0; $j=1; $date = date("mdy"); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $this->getLines()) { // $split was here, empty value.. // set your filename pattern here. $fname = $this->Getpath()."dma_map_$date.$j.csv"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } fclose ($handle); } с function run(){ $buffer=''; $i=0; $j=1; $date = date("mdy"); $handle = @fopen ($this->Getsource(), "r"); while (!feof ($handle)) { $buffer .= @fgets($handle, 4096); $i++; if ($i >= $this->getLines()) { // $split was here, empty value.. // set your filename pattern here. $fname = $this->Getpath()."dma_map_$date.$j.csv"; if (!$fhandle = @fopen($fname, 'w')) { print "Cannot open file ($fname)"; exit; } if (!@fwrite($fhandle, $buffer)) { print "Cannot write to file ($fname)"; exit; } fclose($fhandle); $j++; unset($buffer,$i); } } fclose ($handle); } 

Я использовал этот класс, чтобы разбить 500 000 строк CSV-файла на 10 файлов, поэтому phpmyadmin может использовать его без проблем с таймаутом. Работал как шарм.