PHP генерирует CSV, не отправляя правильные новые переводы строки - PullRequest
12 голосов
/ 30 апреля 2010

У меня есть скрипт, который генерирует CSV-файл, используя следующий код:

header('Content-type: text/csv');
header('Content-Disposition: attachment; filename="'.date("Ymdhis").'.csv"');
print $content;

Переменная $ content просто содержит строки с полями, разделенными запятыми, а затем завершается с помощью. "\ N"; создать новую строку.

Когда я открываю файл в CSV, он выглядит нормально, однако, когда я пытаюсь использовать файл для импорта во внешнюю программу (MYOB), он не распознает символ конца строки (\ n) и принимает одну длинную строку текст.

Когда я просматриваю содержимое файла в блокноте, символ конца строки (\ n) представляет собой маленькое прямоугольное поле, которое выглядит как код символа 0x7F.

Если я открою файл и снова сохраню его в Excel, он удалит этот символ и заменит его соответствующим символом конца строки, и я смогу импортировать файл.

Какой символ мне нужно генерировать в PHP, чтобы блокнот распознал его как действительный символ конца строки? (\ n) очевидно не выполняет эту работу.

Ответы [ 3 ]

20 голосов
/ 30 апреля 2010

Используйте "\ r \ n". (с двойными кавычками)

Выше приведены символы ascii для возврата каретки + перевода строки.

Исторически это относится к ранним дням вычисления телетайпа, когда вывод печатался на бумаге, и возврат каретки головки телетайпа в начало строки был отдельной операцией для подачи строки через принтер. Вы можете перезаписать строки, просто сделав возврат каретки и вставив пустые строки просто переводом строки. Doing вернул голову в начало строки и дал ей новую строку для печати. ​​

То, что именно требовалось, отличалось между системами -

  • Только перевод строки: - большинство Unix-подобных систем
  • Возврат каретки плюс перевод строки: - Системы на базе DEC и MS-DOS
  • Только возврат каретки: - Ранняя версия Apple / Mac OS

Итак, в данный момент вы генерируете новую строку только в системе Unix. В Википедии есть хорошая страница об этом.

На самом деле есть инструменты командной строки unix, которые также могут выполнять преобразование. Команды unix2dos и dos2unix преобразуют текстовые файлы ascii вперед и назад между форматами unix и dos путем преобразования перевода строки в перевод строки, возврат каретки и наоборот.

4 голосов
/ 11 января 2012

Обязательно используйте двойные кавычки вокруг \ r \ n, а не одинарные, как указано в предыдущем ответе!

0 голосов
/ 01 ноября 2016

У меня возникла такая же проблема. Позже я заменил
одинарные кавычки ' с двойными кавычками " переменная здания $ content .

т.е. Хранение внешних кавычек скорее двойных, чем единичных в переменной $ content .

И это сработало :)

...