Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana dużej ilości danych
Forum PHP.pl > Forum > PHP
lmdl
Witam,

Mam taki problem że potrzebuję zmienić masowo pewne fragmenty pliku tekstowego a następnie go zapisać na dysku.

Struktura wygląda mniej więcej tak:

dfgdf34534,54,34,656,ZNACZNIK1fjfdgj,dfg,345345,5464,234,ZNACZNIK1345dfg,45,fg45


Problem polega na tym że muszę zmienić przecinki na inny znak tylko we fragmencie między znacznikami ale trwa to strasznie długo.

Plik zawierający dane wejściowe zawiera 20 000 000 znaków. Działającą funkcję do podmiany mam napisaną ale szukam teraz szybszego rozwiązania.

Macie jakieś sprawdzone metody ?
darko
Cytat(lmdl @ 11.01.2010, 13:46:40 ) *
Działającą funkcję do podmiany mam napisaną ale szukam teraz szybszego rozwiązania.

Pokaż ją.
lmdl
  1. function replaceBetween($startString, $endString, $searchString, $replaceString, $data,) {
  2. $i = 0;
  3. $err = 0;
  4.  
  5. do
  6. {
  7. $firstFound = strpos($data, $startString,$i);
  8. if( !empty($firstFound) ) {
  9. $secondFound = strpos($data, $endString,$firstFound+1);
  10.  
  11. $searchStringLenght = ($secondFound-$firstFound) + strlen($startString) + 1;
  12.  
  13. $k = $firstFound + strlen($startString);
  14. do
  15. {
  16. $searchStringPos = strpos($data, $searchString, $k );
  17. if( $searchStringPos < $secondFound && !empty($searchStringPos) ) {
  18. $data = substr_replace($data, $replaceString, $searchStringPos, 1);
  19. }
  20.  
  21. $k = $k+1;
  22. } while ( !empty($searchStringPos) );
  23.  
  24. } else $err = 1;
  25. $i = $firstFound + 1;
  26. }
  27. while( $err != 1 );
  28.  
  29. return $data;
  30. }



Cała funkcja. Szuka najpierw początkowego znacznika, następnie końcowego, a później podmienia wartości tylko w tym fragmencie między przedziałami. Niestety przy dużej ilości danych nie sprawdza się.
lmdl
Witam,

Wykonuję operację (substr_replace) na dużej ilości danych, i kiedy wartość podmian dochodzi do ok 10000, skrypt się zatrzymuje na ok 5 sek, a następnie idzie dalej. Czy można pominąć jakoś te pauzy ?
darko
Przekazujesz do funkcji całą zawartość pliku w postaci jednej zmiennej $data ? Lepiej czytać plik linia po linii i obrabiać linia po linii, będzie szybciej. Zastosowanie wyrażeń regularnych i preg_match_all raczej nie bedzie szybsze w tym przypadku, ale mogę się mylić.
Cysiaczek
Połączyłem tematy, bo dotyczą tego samego. Następnym razem jak masz nadal problem z czymś, to nie zaczynaj nowego tematu, tylko kontynuuj w aktualnie posiadanym

Facet... napisz po ludzku jak wygląda problem, czyli napisz:
1. Jak wygląda pełen string
2. Jak wygląda znacznik

To co wyżej dałeś niewiele mówi
Podejrzewam jednak, że właśnie wynalazłeś koło, bo istnieją takie funkcje jak http://pl2.php.net/manual/en/function.str-replace.php i http://pl2.php.net/manual/en/function.preg-replace.php
Od nich zacznij smile.gif

Pozdrawiam
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.