Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] explode i nieoczekiwane znaki psujące efekt
botnaizi
post 21.02.2012, 20:06:40
Post #1





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 8.12.2009

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


Witam,
mam taki oto skrypt
  1. $text = file(plik);
  2. $cou = count($text);
  3.  
  4. for($i=0;$i<=$cou;$i++){
  5. $exp = explode("/", $text[$i]);


W pliku wszystkie ważniejsze dane oddzielone są znakiem / jednak w niektóych ciągach także występuje znak "/" przez co kod w miejscu gdzie ma wpisać np. $exp[2] wpisuje podzielone pierwsze wyrażenie. Nie mam żadnego pomysłu jak to wykonać. Liczę na przydatne linki, i jakieś podpowiedzi, to powinienem sobie poradzić.


Pozdro


PS.
Przykładowy ciąg:
12345/yy/xx/12345/0/0/321zzz123
gdzie 321zzz123 nie ma znaków specjalnych a yy/zz powinno być razem

@piotrooo89: nie sugeruj się tym co na początku napisałem(teraz jeszcze raz spojrzałem na te ciągi), wyraz jest w środku więc nawet jeśli zacznę od tyłu to nic nie zmieni. Post zedytowany teraz jest poprawnie sytuacja przedstawiona smile.gif

Ten post edytował botnaizi 21.02.2012, 20:13:13
Go to the top of the page
+Quote Post
piotrooo89
post 21.02.2012, 20:08:14
Post #2


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




możesz pokazać przykładową linie z błędem i jak powinno wyglądać poprawnie?


--------------------
Go to the top of the page
+Quote Post
Crozin
post 21.02.2012, 20:11:59
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Coś w tym stylu?
Kod
1/Ala ma kota/23
3/Ala ma kota/psa/66
77/Ala ma psa/19
Gdzie wynikiem powinno być coś takiego?
  1. array(1, "Ala ma kota", 23),
  2. array(3, "Ala ma kota/psa", 66),
  3. array(77, "Ala ma psa", 19)
  4. )
No to w takim przypadku... masz przerąbane. wink.gif Każdy znak "/" w treści danego elementu powinien być przykładowo poprzedzony znakiem ucieczki "\/" oraz zamiast zwykłego explode powinien być użyty jakiś prosty parser albo preg_split z odpowiednim wyrażeniem nie uwzględniającym ciągu "\/" jako separatora.
Go to the top of the page
+Quote Post
piotrooo89
post 21.02.2012, 20:15:00
Post #4


Newsman


Grupa: Moderatorzy
Postów: 4 005
Pomógł: 548
Dołączył: 7.04.2008
Skąd: Trzebinia/Kraków




tak jak @Crozin napisał, może być cieżko, najlepiej zamienić na unikatowy separator, jak nie da się to musisz w jakiś sposób rozróżniać, że taki ciąg musi może mieć /, do tego to już funkcje pokrouj preg*.


--------------------
Go to the top of the page
+Quote Post
qrzysztof
post 21.02.2012, 20:15:08
Post #5





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Ale tu jest jakaś reguła?

Możnaby użyć wyrażeń regularnych rozdzielac poszczególne ciągi za pomocą znaku "/" tylko jeśli przed nim lub po nim jest cyfra. Ale jeśli nie ma żadnej reguły to chyba nie da się tego zrobić. Bo skąd maszyna ma wiedzieć, który "/" jest częścią danych a który separatorem?

Ten post edytował qrzysztof 21.02.2012, 20:16:42


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
botnaizi
post 21.02.2012, 20:17:36
Post #6





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 8.12.2009

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


Cytat(Crozin @ 21.02.2012, 20:11:59 ) *
Coś w tym stylu?
Kod
1/Ala ma kota/23
3/Ala ma kota/psa/66
77/Ala ma psa/19
Gdzie wynikiem powinno być coś takiego?
  1. array(1, "Ala ma kota", 23),
  2. array(3, "Ala ma kota/psa", 66),
  3. array(77, "Ala ma psa", 19)
  4. )
No to w takim przypadku... masz przerąbane. wink.gif Każdy znak "/" w treści danego elementu powinien być przykładowo poprzedzony znakiem ucieczki "\/" oraz zamiast zwykłego explode powinien być użyty jakiś prosty parser albo preg_split z odpowiednim wyrażeniem nie uwzględniającym ciągu "\/" jako separatora.


Tak dokładnie o to chodzi. Źle na początku pisałem, że wyraz jest pierwszy. Jest właśnie w środku. Edycja nie wchodzi w grę, jest tam kilkaset tysięcy linii kodu wink.gif Chyba, że tak: w bazie miałem ustawione int i wszystkie z błędem zwróciły jednakową wartość. Może jeszcze raz przelecieć te błędne ciągi skryptem i zastosować ponownie explode z tym że dodawałbym te 2 wyrazy do siebie. Tylko jeśli byłoby ich więcej to musiałbym tak w kółko ale jak już bym zaczął to z górki. To chyba dałoby wymagany efekt ?

Ten post edytował botnaizi 21.02.2012, 20:21:52
Go to the top of the page
+Quote Post
qrzysztof
post 21.02.2012, 20:23:12
Post #7





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


  1. 3/Ala ma kota/psa/66

W przykładzie, który podał Crozin dałoby się to jeszcze rozdzielić na 1) wszystko przed pierwszym "/", 2) środek, 3) wszystko po ostatnim "/". Ale to znowu pojawia się pytanie czy są jakieś reguły odnośnie liczby "/" w wyrażeniu.

Ile jest kolumn, które mogą zawierać "/" i ile jest wszystkich kolumn? Najlepiej wklej większą próbkę danych.

Ten post edytował qrzysztof 21.02.2012, 20:26:06


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
Go to the top of the page
+Quote Post
botnaizi
post 21.02.2012, 20:27:40
Post #8





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 8.12.2009

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


Cytat(qrzysztof @ 21.02.2012, 20:23:12 ) *
  1. 3/Ala ma kota/psa/66

W przykładzie, który podał Crozin dałoby się to jeszcze rozdzielić na 1) wszystko przed pierwszym "/", 2) środek, 3) wszystko po ostatnim "/". Ale to znowu pojawia się pytanie czy są jakieś reguły odnośnie liczby "/" w wyrażeniu.

Nie nie ma żadnej reguły. Są i liczby i litery.
Kolumn jest 6. Ale nie wiem czy czasem w nazwach nie ma np. "///". Ale chyba rozwiążę to swoim sposobem. Później tylko ze 3 razy pozmieniam dane w skrypcie przy dodawaniu i powinno być ok. Tylko będę musiał poczytać troche więcej o użytych funkcjach.

Ten post edytował botnaizi 21.02.2012, 20:30:52
Go to the top of the page
+Quote Post
Crozin
post 21.02.2012, 20:33:01
Post #9





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Czyli przykładowo powinny być trzy pola na linię, ale może wystąpić na przykład takie coś:
Kod
ala ma kota/psa/a pies/kot/wieloryb ma żółtaczkę/morał z tego/taki, że babcia/dziadek nie ma wąsów
No to nie za bardzo widzę jakąkolwiek metodę, nawet ręcznie możesz nie być w stanie tego zrobić.

Chyba, że w pewnych polach są jednak jakieś spodziewane wartości - wtedy może udałoby się zrobić jakiś (pół)automatyczny skrypt poprawiający to. Ale jeżeli na prawdę nie ma żadnych reguł... jesteś - kolokwialnie mówiąc - w dupie. wink.gif
Go to the top of the page
+Quote Post
botnaizi
post 21.02.2012, 20:36:46
Post #10





Grupa: Zarejestrowani
Postów: 72
Pomógł: 0
Dołączył: 8.12.2009

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


Cytat(Crozin @ 21.02.2012, 20:33:01 ) *
Czyli przykładowo powinny być trzy pola na linię, ale może wystąpić na przykład takie coś:
Kod
ala ma kota/psa/a pies/kot/wieloryb ma żółtaczkę/morał z tego/taki, że babcia/dziadek nie ma wąsów
No to nie za bardzo widzę jakąkolwiek metodę, nawet ręcznie możesz nie być w stanie tego zrobić.

Chyba, że w pewnych polach są jednak jakieś spodziewane wartości - wtedy może udałoby się zrobić jakiś (pół)automatyczny skrypt poprawiający to. Ale jeżeli na prawdę nie ma żadnych reguł... jesteś - kolokwialnie mówiąc - w dupie. wink.gif


Nie, no tak jak pisałem, w bazie wszystkie które miały o jedno "/" za dużo zwróciły te same wartości. Więc chyba pójdę tym tropem.
Tylko teraz kombinować z tymi wyszukaniami, ale przynajmniej może co nieco więcej się dowiem smile.gif


EDIT. Udało mi się to rozwiązać na jeszcze wcześniejszym etapie. Dałem kilka if'ów, że jeśli $exp[6] i wyżej nie były puste to po prostu łączyłem $exp[1] i $exp[2] itd. Wywaliło mi 96 rekordów gdzie ktoś nawalił tych "/////" więcej niż widać, ale to mało wartościowe więc się obejdzie wink.gif

Ten post edytował botnaizi 21.02.2012, 22:21:43
Go to the top of the page
+Quote Post
qrzysztof
post 21.02.2012, 20:38:02
Post #11





Grupa: Zarejestrowani
Postów: 220
Pomógł: 19
Dołączył: 25.04.2009

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


Twoja metoda przelecenia wszystkiego skryptem z ominięciem tych wierszy, które dadzą w wyniku explode >6 kolumn a potem cykliczne powtarzanie operacji jest dobra. Zakładając oczywiście, że "/" pojawia się w ciągach rzadko. Inaczej może być trochę roboty.


--------------------
Znalazłeś sam rozwiązanie swojego problemu? Nie pisz "już wiem, do zamknięcia". Podziel się rozwiązaniem - inni będą mieli łatwiej.
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: 29.03.2024 - 00:42