Создание возврата каретки в ячейке CSV через php

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

Пример стиля-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
  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]

Надеюсь, что это дает больше разъяснений.

Другие вопросы по тегам