fputcsv() w PHP a programy Windowsowe

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.

Dodaj komentarz