Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Parser plików csv
Forum PHP.pl > Forum > PHP
exseerius
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.
Zyx
Jak ma problem, jak jakoś używam jej i bez problemu czytam dane w UTF-8?
exseerius
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ę...
vermis
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.
exseerius
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?
wewior
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.
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.