Создание возврата каретки в ячейке CSV через PHP - PullRequest
3 голосов
/ 26 октября 2010

Я пытаюсь динамически сгенерировать CSV-файл с несколькими ячейками, которые будут содержать несколько строк, например, поле адреса нужно будет сгруппировать в одну ячейку "адреса" вместо адреса, города, штата и т. Д. Все идет хорошо, но в течение последних двух дней я пытался вставить \ r, \ r \ n, \ n, chr (10), chr (13), а также возврат каретки в коде, чтобы создать возврат каретки Я ищу в камере. Все они терпят неудачу, либо буквально выводятся в моем csv как "\ r" и т. Д., Либо когда я выполняю возврат каретки в коде, он генерирует новую строку. Я использую это, чтобы создать разрывы в моих клетках, но это не работает

$groupedCell = implode('\r',$data);

Я почти уверен, что код правильный, поскольку он помещает туда, где я хотел бы возврат каретки, но не фактический возврат, который я ищу. Я пробовал несколько разных кодировок, но все же не повезло, я тестирую в Open Office, который, я думаю, может быть проблемой, но я бы предположил, что он может обрабатывать возврат каретки внутри ячейки, и я не видел никакой документации, чтобы поддержать в противном случае. Спасибо за чтение!

Ответы [ 3 ]

18 голосов
/ 26 октября 2010

Спецификация CSV - это та, которую я нахожу реализованной многими различными способами ... в принципе кажется, что это лишь половина скорости, что разочаровывает, учитывая ее популярность.

Включение нового-линии в пределах ячейки в CSV-ячейке может потребоваться обернуть ячейку или экранировать новую строку.В связанном документе вы заметите, что есть три способа сделать это - и разные программы обрабатывают это по-разному:

  1. Excel заключает всю ячейку в двойные кавычки: ячейка может иметь (неэкранированные) символы новой строкивнутри нее и считается отдельной ячейкой, если она заключена в двойные кавычки (обратите внимание также, что вам нужно использовать двойные кавычки в стиле Excel, экранирующие содержимое ячейки)
  2. Другие программы вставляют одну обратную косую черту передсимвол, поэтому строка, оканчивающаяся на \, считается не концом строки, а символом новой строки в ячейке.В ячейке могут быть символы неэкранированной новой строки, если им предшествует символ обратной косой черты.
  3. Другие по-прежнему заменяют символ новой строки на экранирование символов в стиле C, фактическую последовательность символов \n или \r\n.В этом случае в ячейке полностью экранированы символы новой строки.

Проблема усугубляется потенциальной необходимостью экранирования управляющих символов (а также другого содержимого (например, " в # 1 и \ в # 2 + 3) и различные стили экранирования (например, встроенная кавычка может быть экранирована как: двойная двойная кавычка "" или обратная косая черта-двойная кавычка \")

Мой совет: сгенерируйте документ open-office с несколькими строками и escape-символами ключа и посмотрите, как open-office генерирует файл CSV .В этом разделе вы можете выбрать, какой из перечисленных выше методов использовать для перехода на новую строку внутри ячеек, а какой экранировать.method.

пример стиля-1 (excel):

#num,str,num
1,"Hello
World",1990
2,"Yes",1991

пример стиля-2:

#num,str,num
1,Hello \
Word,1990
2,Yes,1991

пример стиля-3:

#num,str,num
1,Hello \nWorld,1990
2,Yes,1991
8 голосов
/ 26 октября 2010

Вам нужно использовать "\r".Вы не можете использовать экранированные символы (кроме \') в одиночных кавычках.'\n' и '\r' - это буквальный обратный слеш, за которым следуют n или r, тогда как "\n" и "\r" - это новые строки и возврат каретки соответственно.

Что касается вставки новых строк в вашФайл CSV, зависит от вашей реализации.Стандарт CSV отсутствует, поэтому вам придется выяснить, какой формат использовать в зависимости от системы, в которую вы отправляете данные CSV.Некоторые могут принять последовательность '\n' и интерпретировать ее как новую строку, другие могут разрешить буквальный перевод строки при условии, что ячейка заключена в кавычки, а третьи вообще не будут принимать новые строки.

1 голос
/ 11 мая 2013
  1. Создан лист Excel 2010 с 3 столбцами.
  2. Добавлена ​​строка заголовка с литеральными значениями: один, два, три
  3. Добавлена ​​1 строка данных с литеральными значениями: abc, abc, abc, за исключением того, что во 2-м столбце я нажимал ALT + ENTER послекаждую букву для создания возврата каретки и перевода строки.
  4. Сделал SAVE AS> OTHER и выбрал CSV, игнорируя предупреждения.
  5. Изучил данные CSV с помощью NOTEPAD ++ и нажал кнопку Показать все символы вПанель инструментов.

Можно увидеть следующее:

one, two, three[CR][LF]
abc,"a[LF]
b[LF]
c",abc[CR][LF]

Надеюсь, это даст больше ясности.

...