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:
$buffer = ''; $field = 't_date'; $row=0; $byte_number = 0; while( $byte_number <= $lenght) { $ch = $content[$byte_number]; $byte_number++; if ( $ch == ' ' ) { $save = $ch; while ( $ch == ' ' ) { $ch = $content[$byte_number]; $byte_number++; } $ch = $save.$ch; } if ( $ch == ';' and $field == 't_date' ) { $buffer = ''; $field ='t_acounting_date'; $ch = ''; } if ( $ch == ';' and $field == 't_acounting_date' ) { $buffer = ''; $field ='t_side'; $ch = ''; } if ( $ch == ';' and $field == 't_side' ) { $buffer = ''; $field ='t_title'; $ch = ''; } if ( $ch == ';' and $field == 't_title' ) { $buffer = ''; $field ='t_sender'; $ch = ''; } if ( $ch == ';' and $field == 't_sender' ) { $buffer = ''; $field ='t_account'; $ch = ''; } if ( $ch == ';' and $field == 't_account' ) { $buffer = ''; $field ='t_volume'; $ch = ''; } if ( $ch == ';' and $field == 't_volume' ) { $buffer = ''; $field ='t_balance'; $ch = ''; } if ( $ch == ';' and $field == 't_balance' ) { $ch = $content[$byte_number]; $byte_number++; $ch = $content[$byte_number]; $byte_number++; $row++; $field = 't_date'; $ch = ''; $buffer = ''; $cvs = ''; } }
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:
(2) (50) t_date 2 (0) (48) t_date 20 (1) (49) t_date 201 (4) (52) t_date 2014 (-) (45) t_date 2014- (0) (48) t_date 2014-0 (9) (57) t_date 2014-09 (-) (45) t_date 2014-09- (0) (48) t_date 2014-09-0 (9) (57) t_date 2014-09-09 (;) (59) t_date /app/Controller/PaymentsController.php (line 378) 't_date' => '2014-09-09' ) (2) (50) t_acounting_date 2 (0) (48) t_acounting_date 20 (1) (49) t_acounting_date 201 (4) (52) t_acounting_date 2014 (-) (45) t_acounting_date 2014- (0) (48) t_acounting_date 2014-0 (9) (57) t_acounting_date 2014-09 (-) (45) t_acounting_date 2014-09- (0) (48) t_acounting_date 2014-09-0 (9) (57) t_acounting_date 2014-09-09 (;) (59) t_acounting_date /app/Controller/PaymentsController.php (line 384) 't_date' => '2014-09-09', 't_acounting_date' => '2014-09-09' ) (P) (80) t_side P (R) (82) t_side PR (Z) (90) t_side PRZ (E) (69) t_side PRZE (L) (76) t_side PRZEL (E) (69) t_side PRZELE (W) (87) t_side PRZELEW ( ) (32) t_side PRZELEW Z (E) (69) t_side PRZELEW ZE (W) (87) t_side PRZELEW ZEW (N) (78) t_side PRZELEW ZEWN (E) (69) t_side PRZELEW ZEWNE (T) (84) t_side PRZELEW ZEWNET (R) (82) t_side PRZELEW ZEWNETR (Z) (90) t_side PRZELEW ZEWNETRZ (N) (78) t_side PRZELEW ZEWNETRZN (Y) (89) t_side PRZELEW ZEWNETRZNY ( ) (32) t_side PRZELEW ZEWNETRZNY P (R) (82) t_side PRZELEW ZEWNETRZNY PR (Z) (90) t_side PRZELEW ZEWNETRZNY PRZ (Y) (89) t_side PRZELEW ZEWNETRZNY PRZY (C) (67) t_side PRZELEW ZEWNETRZNY PRZYC (H) (72) t_side PRZELEW ZEWNETRZNY PRZYCH (O) (79) t_side PRZELEW ZEWNETRZNY PRZYCHO (D) (68) t_side PRZELEW ZEWNETRZNY PRZYCHOD (Z) (90) t_side PRZELEW ZEWNETRZNY PRZYCHODZ (A) (65) t_side PRZELEW ZEWNETRZNY PRZYCHODZA (C) (67) t_side PRZELEW ZEWNETRZNY PRZYCHODZAC (Y) (89) t_side PRZELEW ZEWNETRZNY PRZYCHODZACY (;) (59) t_side /app/Controller/PaymentsController.php (line 390) 't_date' => '2014-09-09', 't_acounting_date' => '2014-09-09', 't_side' => 'PRZELEW ZEWNETRZNY PRZYCHODZACY' ) (") (34) t_title " (O) (79) t_title "O (P) (80) t_title "OP (L) (76) t_title "OPL (A) (65) t_title "OPLA (T) (84) t_title "OPLAT (A) (65) t_title "OPLATA ( ) (32) t_title "OPLATA Z (A) (65) t_title "OPLATA ZA ( ) (32) t_title "OPLATA ZA K (U) (85) t_title "OPLATA ZA KU (R) (82) t_title "OPLATA ZA KUR (S) (83) t_title "OPLATA ZA KURS (,) (44) t_title "OPLATA ZA KURS, ( ) (32) t_title "OPLATA ZA KURS, M (I) (73) t_title "OPLATA ZA KURS, MI (C) (67) t_title "OPLATA ZA KURS, MIC (H) (72) t_title "OPLATA ZA KURS, MICH (A) (65) t_title "OPLATA ZA KURS, MICHA (Ł) (163) t_title "OPLATA ZA KURS, MICHAŁ ( ) (32) t_title "OPLATA ZA KURS, MICHAŁ G (R) (82) t_title "OPLATA ZA KURS, MICHAŁ GR (A) (65) t_title "OPLATA ZA KURS, MICHAŁ GRA (B) (66) t_title "OPLATA ZA KURS, MICHAŁ GRAB (C) (67) t_title "OPLATA ZA KURS, MICHAŁ GRABC (Z) (90) t_title "OPLATA ZA KURS, MICHAŁ GRABCZ (A) (65) t_title "OPLATA ZA KURS, MICHAŁ GRABCZA (K) (75) t_title "OPLATA ZA KURS, MICHAŁ GRABCZAK (") (34) t_title "OPLATA ZA KURS, MICHAŁ GRABCZAK" (;) (59) t_title /app/Controller/PaymentsController.php (line 396)
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?