Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
Witam,
jestem poczatkujacy w temacie PHP i oraz pisze pierwszy raz na tym forum. Dlatego z gory przepraszam za bledy. Mam problem z wczytaniem pliku tekstowego, z danymi przelewow bankowch w formacie zblizonym do CSV (nie prawdziwy CSV). Najpier wczytuje plik do zmiennej $content. Potem parsuje w petli zmienna $content w poszukiwaniu oddzielonych przecinkami, lub innymi znakami separacji pol danych, pole po polu i linia po linni. Parsowane dane sa wrzucane do wielowymiarowej tablicy, gdzie lokalizuje wszystkie przelwy oraz wszystkie pola dla danego przelewu. Skrypt pracuje poprawnie jak w polach tekstowych nie ma polskiego znaku. Jezeli chociaz w jednym polu danego wiersza znajduje sie polski znak, to wszystkie elementy tablicy dotyczacej danego wiersza sa puste. Dlaczego? Tutaj wrzuam petle ktora parsuje:
Nie moge wrzucic screen shootu, ale wglada to w ten sposob, ze kiedy pointer parsujacy natrafi na bajt zawierajacy polski znak, to element tablicy jest pelen znakow, dopiero kiedy pointer parsujacy dojdzie do konca pola, to element tablicy zastepowany jest nul. Tutaj wklejam wynik ekranu podczas uruchomienia kodu, w celu debugu dodalem tam wyswietlanie zmiennych:
Dla wygoty debugowania w nawiasie wyswietla znak (A) oraz jego kod ASCII (65) przy kazdym wczytanym znaku. Widac ze skrypt prawidlowo odczytal pola w liniach drugiego listningu debugujacego 13,31,69 i tablica $csv zawiera dane, ale poczawszy od linii (tu mowie caly czas o debugu) 108, tablic $csv znika, zamienia sie w null, bo w polu byl polski znak, widac to w linni 97. Jezeli usune polski znak Ł z pliku tekstowego, to petla parsujaca przejdzie poprawnie. Czy ktos moze mi pomoc? |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%)
|
pokaż kilka wierszy z pliku
I prawie na pewno da się dobrać do tego tym: http://pl1.php.net/manual/en/function.fgetcsv.php |
|
|
|
Post
#3
|
|
|
Grupa: Zarejestrowani Postów: 324 Pomógł: 105 Dołączył: 7.08.2012 Ostrzeżenie: (0%)
|
|
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
pokaż kilka wierszy z pliku Przykladowy pierwszy wiersz: ------------ 2014-09-09;2014-09-09;PRZELEW ZEWNETRZNY PRZYCHODZACY;"OPLATA ZA KURS, MICHA£ XXXXXXXX";"ANDRZEJ JERZY XXXXXXXX UL. XXXXXXXX M.16 08-110 SIEDLCE";'1111102020202010101020949505';200,00;250,67; ---------- I prawie na pewno da się dobrać do tego tym: http://pl1.php.net/manual/en/function.fgetcsv.php Probowalem na samym poczatku ta funkcja. Napotkalem problem ze znakami cudzyslowu (''). W definicji funkcji : nie mozna ustawic, aby usuwac znaki ('') dlatego wykonalem to samodzielnie. W przykladzie widac, ze pole banku jest otoczone znakiem (') a pole adresu ('') a pole daty nie ma znaku (''), to powodowalo mi trudnosc, potem musialem kasowac te znaki dodatkowe, ale juz nie pamietam czy plik poprawnie sie wczytal, bo zrezygnowalem na samym poczatku z tej funkcji. Uwazas ze ona moze pomoc? Wszystko jest postawione na serverze Linux oraz Apache, zaczynam przypuszczac, moze jest jakis blad w konfiguracji polskich liter w systemie. Albo to jest BUG w PHP? Dlaczego tak uwazasz? Nie rozumiem. Petla iteracyjna poprawnie docodzi do konca zmiennej typu string, co oznacza ze dlugosc jest poprawnie odczytana, ilosc znakow jest prawidlowa, nawet widac to na zrzucie ekranu. Nie rozumiem tego wpisu, jaki ma zwiazek z problemem. Ten post edytował tomas3man 23.10.2014, 09:08:30 |
|
|
|
Post
#5
|
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%)
|
jak użyjesz funkcji którą podałem to przy odczycie możesz zrobić
coś takiego:
dzięki temu szybko pozbędziesz się cudzysłowie z wiersza |
|
|
|
Post
#6
|
|
|
Grupa: Zarejestrowani Postów: 324 Pomógł: 105 Dołączył: 7.08.2012 Ostrzeżenie: (0%)
|
Cytat Dlaczego tak uwazasz? Nie rozumiem. Petla iteracyjna poprawnie docodzi do konca zmiennej typu string, co oznacza ze dlugosc jest poprawnie odczytana, ilosc znakow jest prawidlowa, nawet widac to na zrzucie ekranu. Nie rozumiem tego wpisu, jaki ma zwiazek z problemem. Dlatego: Ja zawsze korzystam z funkcji mb_*, jeśli tylko mam do czynienia z polskimi ogonkami. Jednak przyznam, że nie zagłębiałem się dokładnie w Twój kod. Po prostu jak tylko słyszę polskie znaczki czy UTF-8, od razu "przełączam się" na mb_*. |
|
|
|
Post
#7
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
Dlatego: Ja zawsze korzystam z funkcji mb_*, jeśli tylko mam do czynienia z polskimi ogonkami. Jednak przyznam, że nie zagłębiałem się dokładnie w Twój kod. Po prostu jak tylko słyszę polskie znaczki czy UTF-8, od razu "przełączam się" na mb_*. Rozumiem juz dlaczego. To dobra rada, dzieki bardzo. Faktycnie nie wiedzialem, ze takie jest zjawisko. Zamienie w kodzie. Ale mysle ze to nie wplywa na blad ktory opisalem. jak użyjesz funkcji którą podałem to przy odczycie możesz zrobić coś takiego:
dzięki temu szybko pozbędziesz się cudzysłowie z wiersza Super, dziekuje bardzo, nie wiedzialem ze moge uzyc kilka znakow jak '' lub ' w parametrze dla funkcji TRIM. Dziekuje bardzo, sprobuje uzy tego kodu i sprawdze jak dziala. Dam odpowiedz jeszcze dzis wieczorem po pracy, jak sie uda to klikne na klawisz POMOGL. Mam jeszcze pytnie, dlaczego ustawiasz 1000 jako parametr w fgetcsv? Poprostu tak z random? |
|
|
|
Post
#8
|
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%)
|
To po prostu przykład z manuala (IMG:style_emoticons/default/smile.gif) Nie chciało mi się pisać i tak zostało (IMG:style_emoticons/default/smile.gif)
|
|
|
|
Post
#9
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
jak użyjesz funkcji którą podałem to przy odczycie możesz zrobić coś takiego:
dzięki temu szybko pozbędziesz się cudzysłowie z wiersza DZIEKUJE!!! Musialem zmienic lekko twoj skrypt bazujac na pomocy z podrrecznika i udalo sie, polskie litery nie powoduja bledow. Oto skrypt:
------ Edytuje po okolo 30 minutach. Sytuacja sie nie zmienia. Skrypt pracuje prawidlowo, gdy nie polskiego znaku. To znaczy, jezeli w pliku CSV znajdzie sie polski znak to echo debug($data) zwraca pustke NULL. To samo zbadalem, ze jezeli wstawie w miejsce oznaczone przezemnie w petli echo debug($data) to w kazdej iteracji, ktora wczytuje jedna linie pliku CSV moge widziec co zawiera zmienna i widac dokladnie ze zmienna $data zamienia sie w NULL gdy w linni wystapi polski znak. Wklejam wynik ekranu, gdy w pierwszej linni jest brak polskich znakow:
Ten post edytował tomas3man 23.10.2014, 17:39:16 |
|
|
|
Post
#10
|
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%)
|
zamiast echo debug daj po prostu var_dump (cake?)
|
|
|
|
Post
#11
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
zamiast echo debug daj po prostu var_dump (cake?) A co moze zmienic? Myslisz, ze to jest blad Framework'a? Tak to jest Cake. Sprobuje dzis i dam ci znac. zamiast echo debug daj po prostu var_dump (cake?) Wiesz Pyton_000, okazuje sie, że pomogło, to znaczy polecenie var_dump pokazuje, że zawartość tablicy $data zawiera dane, natomiast echo debug($data) pokazuje puste. Dziwne to jest. |
|
|
|
Post
#12
|
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%)
|
Pokaż wynik z tego vd
|
|
|
|
Post
#13
|
|
|
Grupa: Zarejestrowani Postów: 10 Pomógł: 0 Dołączył: 22.09.2014 Ostrzeżenie: (0%)
|
Pokaż wynik z tego vd Dopisalem do pętli zapisywanie do bazy. Udalo sie, wszystkie pola przelewow i linie pliku CSV zapisaly sie w bazie. Ale zauwazylem, ze wszedzie gdzie w polu bazy wystepuje znak polski diakrytyczny, to ciag znakow jest urwany, np. "Janusz Łuczak" => "Janusz ". Wklejam moj kod:
|
|
|
|
![]() ![]() |
|
Aktualny czas: 24.12.2025 - 10:02 |