PHP od wersji 5.1.0 udostępnia dodatkowe funkcje pomagające w pracy z plikami CSV. Do odczytywania zawartych w nich danych możemy posłużyć się fgetcsv(), pliki możemy tworzyć przy użyciu fputcsv(). W przypadku późniejszego importy takich danych w niektórych programach windowsowych możemy jednak napotkać na niespodziewany problem.
Zapis pliku przy użyciu fputcsv()jest bardzo prosty. Należy najpierw plik otworzyć, a następnie linia po linii zapisać. Pokazano to na poniższym przykładzie:
<?php $data = array ( array('aaa', 'bbb', '111'), array('ccc', 'ddd', '222'), array('eee', 'fff', '333'), ); $fp = fopen('data.csv', 'w'); foreach ($data as $row) { fputcsv($fp, $row, ';'); } fclose($fp); ?>
Plik po zapisaniu jest całkowicie poprawny, jednak w przypadku importu do niektórych programów Windowsowych, możemy napotkać nieoczekiwany błąd. Wczytanie pliku może być niemożliwe, problem stanowią tu znaki końca linii. W przypadku PHP, linie kończone są „po linuksowemu”, czyli za pomocą „\n”. Tymczasem programy pod Windows oczekują swojego formatu, czyli „\r\n”.
Istnieje proste rozwiązanie tego problemu w postaci… rezygnacji z funkcji fputcsv(). Jak podaje dokumentacja można co prawda skorzystać ze zmiany w konfiguracji parametru mkonfiguracyjnego auto_detect_line_endings, jednak nie zawsze mamy do niego dostęp.
Zamiast fputcsv() wystarczy więc użyć zwykłej funkcji fwrite() samodzielnie określając w zapisywanym ciągu znak końca linii. Zmieniony kod może wyglądać następująco:
<?php $data = array ( array('aaa', 'bbb', '111'), array('ccc', 'ddd', '222'), array('eee', 'fff', '333'), ); $fp = fopen('data2.csv', 'w'); foreach ($data as $row) { fwrite($fp, "{$row[0]};{$row[1]};{$row[0]}\r\n"); } fclose($fp); ?>
Można także skorzystać z gotowej, bezpiecznej odmiany funkcji fputcsv(), umieszczonej w komentarzach do dokumentacji.