2013-06-06 16 views
9

W PHP, jak mogę otworzyć każdy plik, wszystkie pliki tekstowe, w katalogu i scalić je wszystkie w jeden plik tekstowy.połączenie wszystkich plików w katalogu z jednym plikiem tekstowym

Nie wiem, jak otworzyć wszystkie pliki w katalogu, ale chciałbym użyć polecenia file(), aby otworzyć następny plik, a następnie foreach, aby dołączyć każdą linię do tablicy. tak:

$contents = array(); 
$line = file(/*next file in dir*/); 
foreach($lines as line){ 
    array_push($line, $contents); 
} 

Wtedy piszę tę tablicę do nowego pliku tekstowego Mam jeden nie osiągnięto więcej plików w katalogu.

jeśli masz lepszy sposób na zrobienie tego, proszę daj mi znać.

Jeśli możesz mi pomóc w implementacji mojego rozwiązania, szczególnie w otwieraniu następnego pliku w katalogu, daj mi znać!

+0

Zacznij od przeczytania o funkcji ['opendir'] (http://php.net/manual/en/function.opendir.php) - i powiązanych. –

Odpowiedz

2

Sposób, w jaki robisz to będzie zużywać dużo pamięci, ponieważ musi posiadać zawartość wszystkich plików w pamięci ... To podejście może być trochę lepiej

pierwsze get wszystkich plików, które będą chcieli

$files = glob("/path/*.*"); 

Następnie otwórz plik wyjściowy uchwyt

$out = fopen("newfile.txt", "w"); 

Następnie cykl poprzez akt czytania i pisania.

foreach($files as $file){ 
     $in = fopen($file, "r"); 
     while ($line = fread($in)){ 
      fwrite($out, $line); 
     } 
     fclose($in); 
    } 

Następnie oczyścić

fclose($out); 
+0

Dziękuję, możesz mi pomóc z jeszcze dwoma rzeczami? Zanim zamknę plik, jak mogę usunąć wszystkie duplikaty słów/linii (każda linia zawiera jedno słowo), a następnie ułożyć w alfabetyczne wiersze? –

+0

jeśli jesteś na maszynie unix/linux po wykonaniu powyższego możesz uruchomić go przez 'exec (" sort newfile.txt | uniq> newfile.sorted.txt ""); ' – Orangepill

+0

Ah, okay. Uruchomę to polecenie. Dziękuję Ci. –

8

odpowiedź OrangePill jest źle.

Zwraca pusty plik i kompiluje błąd. Problemem było to, że użył fread (odczytuje bajty) zamiast fget (czyta wiersze)

Jest to odpowiedź robocza:

//File path of final result 
    $filepath = "mergedfiles.txt"; 

    $out = fopen($filepath, "w"); 
    //Then cycle through the files reading and writing. 

     foreach($filepathsArray as $file){ 
      $in = fopen($file, "r"); 
      while ($line = fgets($in)){ 
       print $file; 
       fwrite($out, $line); 
      } 
      fclose($in); 
     } 

    //Then clean up 
    fclose($out); 

    return $filepath; 

Enjoy!

+0

Dziękuję bardzo @rod –

1

Spróbuj tego:

<?php 
//Name of the directory containing all files to merge 
$Dir = "directory"; 


//Name of the output file 
$OutputFile = "filename.txt"; 


//Scan the files in the directory into an array 
$Files = scandir ($Dir); 


//Create a stream to the output file 
$Open = fopen ($OutputFile, "w"); //Use "w" to start a new output file from zero. If you want to increment an existing file, use "a". 


//Loop through the files, read their content into a string variable and write it to the file stream. Then, clean the variable. 
foreach ($Files as $k => $v) { 
    if ($v != "." AND $v != "..") { 
     $Data = file_get_contents ($Dir."/".$v); 
     fwrite ($Open, $Data); 
    } 
    unset ($Data); 
} 


//Close the file stream 
fclose ($Open); 
?> 
0

Spróbuj poniżej kodu i cieszyć się !!!

/* Directory Name of the files */ 
$dir = "directory/subDir"; 
/* Scan the files in the directory */ 
$files = scandir ($dir); 
/* Loop through the files, read content of the files and put then OutFilename.txt */ 
$outputFile = "OutFilename.txt"; 
foreach ($files as $file) { 
    if ($file !== "." OR $file != "..") { 
     file_put_contents ($outputFile, file_get_contents ($dir."/".$file), FILE_APPEND); 
    } 
} 
Powiązane problemy