[PHP] explode i nieoczekiwane znaki psujące efekt |
[PHP] explode i nieoczekiwane znaki psujące efekt |
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
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 Ten post edytował botnaizi 21.02.2012, 20:13:13 |
|
|
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?
-------------------- |
|
|
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 Gdzie wynikiem powinno być coś takiego?3/Ala ma kota/psa/66 77/Ala ma psa/19 No to w takim przypadku... masz przerąbane. 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. |
|
|
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*.
-------------------- |
|
|
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.
|
|
|
21.02.2012, 20:17:36
Post
#6
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 8.12.2009 Ostrzeżenie: (0%) |
Coś w tym stylu? Kod 1/Ala ma kota/23 Gdzie wynikiem powinno być coś takiego?3/Ala ma kota/psa/66 77/Ala ma psa/19 No to w takim przypadku... masz przerąbane. 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 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 |
|
|
21.02.2012, 20:23:12
Post
#7
|
|
Grupa: Zarejestrowani Postów: 220 Pomógł: 19 Dołączył: 25.04.2009 Ostrzeżenie: (0%) |
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.
|
|
|
21.02.2012, 20:27:40
Post
#8
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 8.12.2009 Ostrzeżenie: (0%) |
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 |
|
|
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. |
|
|
21.02.2012, 20:36:46
Post
#10
|
|
Grupa: Zarejestrowani Postów: 72 Pomógł: 0 Dołączył: 8.12.2009 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. 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 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 Ten post edytował botnaizi 21.02.2012, 22:21:43 |
|
|
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.
|
|
|
Wersja Lo-Fi | Aktualny czas: 29.03.2024 - 00:42 |