Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Usuwanie linii z pliku txt
Forum PHP.pl > Forum > Przedszkole
kadet
Witam.
Nie jestem żadnym specem od php, potrzebuje napisać pewien skrypt i go napisałem ale wydaje mi się on bardzo nieoptymalny.
Otóż problem wygląda tak: posiadam plik dane.txt z indeksami produktów, który ma następujący format:
Kod
60
62
63
64
65
67
72
77
78
.
.
.

I tak łącznie ok. 20 tysięcy linii.
Potrzebuję coś z tym zrobić, ale że serwer nie pozwoli na wykonywanie skryptu przez wiele godzin, więc wpadłem na następujący pomysł. Co 5 minut uruchamiany jest ten skrypt (z crona) pobierający za każdym razem po 5 indeksów
Oto moje wypociny:
  1. <?php
  2. $fp1 = fopen('index.txt', 'r');
  3. $nr = fgets($fp1, 10);
  4. $koniec = $nr + 5;
  5. fclose($fp1);
  6. $fp2 = fopen('index.txt', 'w');
  7. fwrite($fp2, $koniec);
  8. fclose($fp2);
  9. $fp = fopen('dane.txt', 'r'); // otwarcie pliku tylko do odczytu ("r")
  10. flock($fp, 1); // blokowanie pliku do odczytu
  11. $i = 0;
  12. while(!feof($fp) && $i < $nr) { // do póki nie ma końca pliku lub nie ma odpowiedniej linii
  13. $linia = fgets($fp, 10);
  14. $i++; // podwyższenie zmiennej $i o jeden
  15. }
  16. for ($nr; $nr < $koniec; $nr++) {
  17.  $linia = fgets($fp, 10); // pobranie jednej linii do zmiennej $linia
  18.  echo $linia . "<br>";
  19.  }
  20. flock($fp, 3); // odblokowanie pliku
  21. fclose($fp); // zamknięcie pliku
  22. ?>

Działa dokładnie tak jak tego oczekuję. O ile przy początkowych liniach wszystko jest OK, to np. przy końcowych liniach, przy każdym wywołaniu skryptu trzeba przeczytać wszystkie linie aby dojść do tej właściwej. Według mnie to mało optymalne. Próbowałem szukać informacji o tym jak lepiej można by to zrobić. Jedyne co znalazłem to wczytywanie całego pliku do tablicy, operacje na niej i zapisanie jej spowrotem do pliku. Ale to jest chyba jeszcze mniej optymalne (o ile odczyt zajmowałby tyle samo to w rozwiązaniu z tablicą dochodzi jeszcze zapis). Chodzi mi o to, żeby przy każdym wywołaniu skryptu, odczytywane były pierwsze 5 wierszy i od razu usuwane, jednak beż użycia tablicy do tego.
Z góry dziękuję za wszelkie podpowiedzi, ewentualnie uwagi co zrobiłem źle w podanym skrypcie.
Pozdrawiam
Chemiq
żeby usunąć linię:
  1. <?php
  2. unset($linia);
  3. ?>


usuwasz linie które chcesz i później zapisujesz plik biggrin.gif
kadet
unset nie usunie przypadkiem kopii linii, która jest zapisana w zmiennej $linia?
marcio
Angielskiego az tak dobrze nie znam ale co nieco rozumiem
Cytat
unset() destroys the specified variables
The behavior of unset() inside of a function can vary depending on what type of variable you are attempting to destroy. If a globalized variable is unset() inside of a function, only the local variable is destroyed. The variable in the calling environment will retain the same value as before unset() was called.



PRZYKLAD
Kod
function destroy_foo()
{
     global $foo;
     unset($foo);
}

$foo = 'bar';
destroy_foo();
echo $foo;

WYNIK
Cytat
bar

Chodzilo ci o to?
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.