Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Usuwanie linii z pliku txt
kadet
post 16.02.2008, 19:18:45
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 16.02.2008

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Chemiq
post 16.02.2008, 19:25:39
Post #2





Grupa: Zarejestrowani
Postów: 105
Pomógł: 0
Dołączył: 16.07.2006

Ostrzeżenie: (0%)
-----


żeby usunąć linię:
  1. <?php
  2. unset($linia);
  3. ?>


usuwasz linie które chcesz i później zapisujesz plik biggrin.gif
Go to the top of the page
+Quote Post
kadet
post 16.02.2008, 19:47:28
Post #3





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 16.02.2008

Ostrzeżenie: (0%)
-----


unset nie usunie przypadkiem kopii linii, która jest zapisana w zmiennej $linia?
Go to the top of the page
+Quote Post
marcio
post 16.02.2008, 19:53:58
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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?


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.06.2025 - 23:14