Создание возврата каретки в ячейке 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-ячейке, возможно, потребуется обернуть ячейку или экранировать новую строку. В связанном документе вы заметите, что есть три способа сделать это - и разные программы относятся к этому по-разному:
- Excel заключает всю ячейку в двойные кавычки: в ячейке могут быть (неэкранированные) символы новой строки внутри нее, и она будет считаться одной ячейкой, если она заключена в двойные кавычки (обратите внимание также, что вам нужно использовать экранирование двойных кавычек в стиле Excel) внутри содержимого ячейки)
- Другие программы вставляют одну обратную косую черту перед символом, поэтому строка заканчивается
\
не считается концом строки, а символом новой строки в ячейке. В ячейке могут находиться неэкранированные символы новой строки, если им предшествует символ обратной косой черты. - Другие по-прежнему заменяют новую строку на экранирование символов в стиле 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
- Создан лист Excel 2010 с 3 столбцами.
- Добавлена строка заголовка с буквальными значениями: один, два, три
- Добавлена 1 строка данных с буквальными значениями: abc, abc, abc, за исключением того, что во 2-м столбце я нажимал ALT+ENTER после каждой буквы, чтобы создать возврат каретки и перевод строки.
- Сделайте SAVE AS > OTHER и выберите CSV, игнорируя предупреждения.
- Изучил данные CSV с помощью NOTEPAD++ и нажал кнопку "Показать все символы" на панели инструментов.
Можно увидеть следующее:
one, two, three[CR][LF]
abc,"a[LF]
b[LF]
c",abc[CR][LF]
Надеюсь, что это дает больше разъяснений.