Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Parser plików csv
exseerius
post
Post #1





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.12.2006

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


Witam,

Jak w temacie proszę o pomoc w napisaniu parsera plików csv. Wiem że php oferuje juz gotowe rozwiązanie w postaci fgetcsv, natomiast funkcja ta ma problem z obcymi znakami, np cyrylica, hebrajskie i chociazby polskie ogonki.

wyciaganie poprzez fgetcsv danych z csvłki z wymienionymi wyzej znaczkami powoduje wykasowanie owych znaków, natomiast ten sam plik otwarty poprzez file juz wyswietla się ok.

kodowanie pliku jak i skryptów utf-8

zacząłem pisać własny parser, ale napotkałem problem, jezeli w lini jest wiecej niż jeden string oddzielany jakimiś cudzysłowiami albo w stringu znajdują się zdefiniowane delimitery, oto przykłady problematycznych sctingów, może ktoś da radę pomoc, lub ma już gotowe rozwiązanie?

  1. $string = 'Imię,ąęśćźżłóĄĘŚĆŹŻŁÓ,"jakiś, string i \"cos escapowanego\"",jan@kowalski.pl
  2. Январь,Ковальский,"jakis inny string, i cos jeszcze",janek@kowalski.pl';
  3.  
  4. function parse_csv($file,$delimiter=',',$enclosure='"')
  5. {
  6. $allowed_delimiters = array(",",";","|","\t");
  7. $allowed_enclosures = array('"',"'","");
  8.  
  9. $tmp = array();
  10. $patt_d = $delimiter == ' ' ? 's' : $delimiter;
  11.  
  12. foreach (file($file) as $line)
  13. {
  14. $l = str_replace(array("\n","\r\n"),'',$line);
  15.  
  16. $l = preg_match_all('/(?:"(?:\\"|[^"])*"|[^,]*)/',$l,$out);
  17. $tmp[] = $out;
  18. }
  19. return $tmp;
  20. }


Nie wiem jak napisać odpowiedniego regespa, żeby posortował mi wszystko tak jak powinien.
Go to the top of the page
+Quote Post
Zyx
post
Post #2





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

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


Jak ma problem, jak jakoś używam jej i bez problemu czytam dane w UTF-8?


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
exseerius
post
Post #3





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.12.2006

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


No niestety ma problem, bo jakby go nie bylo to wciaz bym uzywal tej wbudowanej funkcji.

Niemniej jednak nie zbaczajac z toru, czy znalazłby sie ktos, kto ogarnałby temat z regexpem do csvałek? googluje juz jakis czas i nic znaleźć nie mogę...
Go to the top of the page
+Quote Post
vermis
post
Post #4





Grupa: Zarejestrowani
Postów: 279
Pomógł: 56
Dołączył: 3.06.2010
Skąd: Tarnowskie Góry

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


Ja też nie miałem nigdy problemów z utf8. Wygląda na to że gdzieś masz błąd i przez to próbujesz wynaleźć koło na nowo.


--------------------
Go to the top of the page
+Quote Post
exseerius
post
Post #5





Grupa: Zarejestrowani
Postów: 55
Pomógł: 0
Dołączył: 31.12.2006

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


ok to moze inaczej.

Mam csvlke wygenerowana pod windowsem wysylam formularzem na serwer postawiony na linuxie. Problem jest z kodowaniem niby oba pliki kodowane sa w utf-8, nawet dla pewnosci jeszcze raz go zapisuje w utf-8 (notepad++) niestety po wyslaniu i wywolaniu funkcji fgetcsv ogonki i non-latino sie kasuja. natomiast file() otwiera plik i prawidlowo wyswietla wszystkie znaki.

jakas propozycja?
Go to the top of the page
+Quote Post
wewior
post
Post #6





Grupa: Zarejestrowani
Postów: 200
Pomógł: 8
Dołączył: 24.09.2003

Ostrzeżenie: (10%)
X----


Dołącze się do tematu ponieważ mam podobny problem z plikami csv w kodowaniu utf-8 i funkcją fgetcsv pobiera mi pola ale bez pierwszych znaków z ogonkami np zamiast "Černěves 50" mam "erněves 50".
Jeśli pierwsza litera jest zwykła tzn np C a nie Č to wszystko jest w porzadku. W tekscie później już też nie ma problemów, tylko pierwszy znak się wysypuje.


--------------------
- - -
PHP, HTML, JS, Quick.Cms v6.4, Quick.Cart v6.7, Simlery
- - -
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 Aktualny czas: 20.08.2025 - 07:43