Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyświetlanie feagmentu pliku
Forum PHP.pl > Forum > Przedszkole
desavil
W jaki sposób mogę wyświetlić np. tylko 100 linii pliku?
Do wyświetlania używam kodu, który czyta mi plik od końca:
  1. $a = array_reverse(file($plik));
  2. foreach($a as $xxx)
  3. echo nl2br($xxx);

I chciałbym wyświetlić tylko 100 linii, a nie wszystkie jeżeli będzie więcej.
W jaki sposób można takie coś uzyskać?
Crozin
Jeżeli możesz sobie pozwolić na wczytanie całego pliku do pamięci to wystarczy, że do obecnego kodu dodasz array_slice i po sprawie. Jeśli jednak plik jest duży, będziesz musiał odczytywać go po kawałku każdorazowo zliczając ilość wczytanych linii. Po osiągnięciu 100 przerywasz dalsze wczytywanie.
cycofiasz
  1. <?php
  2. $myfile = 'plik.txt';
  3.  
  4. $ic = 0;
  5. $ic_max = 100;
  6.  
  7. $handle = fopen($myfile , "r");
  8.  
  9. while (!feof($handle) && ++$ic<=$ic_max)
  10. {
  11. $buffer = fgets($handle, 4096);
  12. echo $buffer."<br>";
  13. }
  14. fclose($handle);
  15. ?>
desavil
A jak zrobić jeszcze z tym odwróceniem, żeby od końca czytało?

:]
cycofiasz
No to możesz zrobić tak jak Crozin napisał

  1. $a = array_reverse(file($plik));
  2. $a = array_slice ( $a , 0 , 100);
  3. foreach($a as $xxx)
  4. echo nl2br($xxx);
desavil
Ale jeżeli plik ma ponad 1-2GB?
cycofiasz
No to wtedy możesz spróbować zastosować taki kod:

  1. <?php
  2. $myfile = 'myfile.txt';
  3. $command = "tac $myfile > /tmp/myfilereversed.txt";
  4. passthru($command);
  5. $ic = 0;
  6. $ic_max = 100; // stops after this number of rows
  7. $handle = fopen("/tmp/myfilereversed.txt", "r");
  8. while (!feof($handle) && ++$ic<=$ic_max) {
  9. $buffer = fgets($handle, 4096);
  10. echo $buffer."<br>";
  11. }
  12. fclose($handle);
  13. ?>


W skrypcie użyto unixowego polecenia tac , może to nie wszędzie działać
desavil
Kurcze, wolałbym bez tmp :/
cycofiasz
dlaczego?

Tu masz jeszcze kilka funkcji, różne dla różnego rozmiaru pliku txt
http://mydebian.blogdns.org/?p=197
Crozin
@cycofiasz: Tworzenie kopii pliku z poziomu konsoli jest nieco bezsensowne, szczególnie w przypadku gdy ma się do dyspozycji takie narzędzia jak tail, które robią dokładnie to czego oczekuje autor wątku.

Jeżeli rozwiązanie miałoby być zrobione niejako w czystym PHP wtedy trzeba będzie nieco zmodyfikować kod. Odczytywać zawartość po kawałku od tyłu (filesize, fopen, fread, fseek(!)), wyszukiwać w tych kawałkach nowych linii (strpos) uwzględniając fakt, że mogą one być zapisane na trzy różne sposoby (\r, \n, \r\n). I tak aż do momentu znalezienia setnej linii bądź cofnięcia się do samego początku pliku.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.