У меня есть базовый PHP-скрипт, который создает файл csv из массива. Вот пример кода:
$array = [ [1,2,3], [4,5,6] ]; $handle = fopen('test.csv', 'w'); foreach($array as $v) fputcsv($handle, $v); fclose($handle);
Полученный файл всегда имеет пустую строку в конце файла, потому что fputcsv не знает, что это последняя строка. Любые (простые) идеи о том, как предотвратить это?
РЕДАКТИРОВАТЬ:
Оригинальный вопрос теперь не имеет значения (для меня, но, возможно, кому-то это понадобится). Предполагается, что fputcsv добавит новую строку, даже в конец документа, и это ожидаемое поведение всех файлов csv.
Я отметил ответ, который решает исходный вопрос, хотя он мне больше не подходит.
Поэтому в моем контексте мне нужно было проверить, является ли последняя строка (или любая строка) этого массива NULL (иначе PHP закончит предупреждение о том, что второй параметр fputcsv равен нулю). Вот мой обновленный сценарий, если кому-то интересно:
$array = [ [1,2,3], [4,5,6] ]; $handle = fopen('test.csv', 'w'); foreach($array as $v) if($v != NULL) fputcsv($handle, $v); fclose($handle);
Я нашел это решение по другому вопросу: https://stackoverflow.com/a/8354413/1564018
$stat = fstat($handle); ftruncate($handle, $stat['size']-1);
Я добавил эти две строки после fputcsv (), и они удалили последний новый символ строки, удалив пустую строку в конце файла.
Как и @Barmar, все строки имеют завершение строки, скажем \ n. То, что вы видите как пустую строку в конце файла, – это ваш редактор. По-настоящему пустая строка состоит из двух строк, заканчивающихся символами подряд. (например, \ n \ n)
Представьте, что у вас пустой файл:
(EOF)
Если вы fputcsv это: array (0, «привет», 3323), вы получаете
(0,hello,3323\nEOF)
данные PHP-документов:
fputcsv () форматирует строку (переданную как массив полей) как CSV и записывает ее ( завершается новой строкой ) в указанный дескриптор файла.
Тогда ожидается пустая строка в вашем редакторе. Но в файле нет такой вещи.
fputcsv
добавляет новую строку после каждой строки, вот как она работает. Из документов :
fputcsv () форматирует строку (переданную как массив полей) как CSV и записывает ее (завершается новой строкой)
Новая строка в конце файла не является ошибкой или что-то, о чем вам нужно беспокоиться. Не пытайтесь удалить его, просто оставьте его.
В комментариях вы упомянули, что у вас есть ошибка:
Предупреждение: fputcsv () ожидает, что параметр 2 будет массивом, boolean
Вероятно, это fgetcsv
неправильным использованием fgetcsv
. Он возвращает FALSE
когда он попадает в конец файла (новая строка). Документы показывают, как использовать его правильно:
while (($data = fgetcsv($handle)) !== FALSE) { }