PHP bir metin dosyası Split

4 Cevap php

Nasıl PHP kullanarak karakter sayısı ayrı dosyalar halinde büyük bir metin dosyası ayırabilirsiniz? Yani 10.000 karakter dosyası her 1000 karakter 10 dosya bölünmüş olacaktır bölünmüş. Ayrıca, ben sadece tam durduktan sonra ayırabilirsiniz bulundu?

Teşekkürler.

GÜNCELLEME 1: Ben zombats kodunu ister ve bazı hataları kaldırıldı ve aşağıdaki ile geldi, ama herkes sadece tam durduktan sonra bölmek için nasıl biliyor?

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

UPDATE 2: I took zombats suggestion and modified the code to that below and it seems to work -

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

4 Cevap

Bir temel fread() ile kolayca gerçekleştirmek mümkün olmalıdır. Eğer okumak istediğiniz kaç bayt belirleyebilirsiniz, böylece yeni bir dosyaya tam bir miktar ve çıkış o okumak için önemsiz bulunuyor.

Böyle bir şey deneyin:

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

EDIT

Belirli bir karakteri OR uzunluğunun belirli bir süre sonra durdurmak isterseniz, o zaman stream_get_line() yerine fread() kullanabiliyordu. Eğer istediğiniz herhangi biten sınırlayıcı belirlemenizi sağlar dışında, hemen hemen aynısı. O not okuma parçası olarak delimeter dönmek unutmayın.

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

Run işlevinde bir hata var; Değişken $split tanımlı değil.

Kolay yolu, dosyanın içeriğini okumak içeriği bölmek, sonra da diğer iki dosyaları kurtarmaktır. Dosyalarınızı bir kaç gigabayt daha iseniz, nedeniyle tamsayı büyüklüğü sınırlamaları PHP yapıyor bir sorun var gidiyoruz.

Ayrıca sizin için bunu yapmak için bir sınıf yazabilirsiniz.

<?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("m-d-y");
        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();
?>

Kaynak http://www.weberdev.com/get_example-3894.html