Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] explode i nieoczekiwane znaki psujące efekt
Forum PHP.pl > Forum > Przedszkole
botnaizi
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
piotrooo89
możesz pokazać przykładową linie z błędem i jak powinno wyglądać poprawnie?
Crozin
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.
piotrooo89
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*.
qrzysztof
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?
botnaizi
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 ?
qrzysztof
  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.
botnaizi
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.
Crozin
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
botnaizi
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
qrzysztof
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.
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.