Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zmiana dużej ilości danych
lmdl
post
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 6.01.2009

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


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 ?
Go to the top of the page
+Quote Post
darko
post
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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

Pokaż ją.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
lmdl
post
Post #3





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 6.01.2009

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


  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ę.
Go to the top of the page
+Quote Post
lmdl
post
Post #4





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 6.01.2009

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


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 ?
Go to the top of the page
+Quote Post
darko
post
Post #5





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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

Ten post edytował darko 11.01.2010, 14:27:24


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #6





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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 think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
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 Aktualny czas: 21.08.2025 - 22:48