Я использую fputcsv в PHP для вывода файла с разделителями-запятыми запроса к базе данных. При открытии файла в gedit в Ubuntu он выглядит правильно - каждая запись имеет разрыв строки (нет видимых символов разрыва строки, но вы можете сказать, что каждая запись разделена, и открытие ее в электронной таблице OpenOffice позволяет мне правильно просмотреть файл.)
Однако мы отправляем эти файлы клиенту в Windows, и в их системах файл появляется в виде одной большой длинной строки. Открыв его в Excel, он вообще не распознает несколько строк.
Я прочитал здесь несколько вопросов, которые очень похожи, в том числе этот, который включает ссылку на действительно информативное объяснение Великого раскола новой строки.
К сожалению, мы не можем просто сказать нашим клиентам, чтобы они открывали файлы в "более умном" редакторе. Они должны быть в состоянии открыть их в Excel. Есть ли какой-либо программный способ обеспечить добавление правильных символов новой строки, чтобы файл можно было открыть в программе для работы с электронными таблицами в любой ОС?
Я уже использую пользовательскую функцию, чтобы принудительно заключать в кавычки все значения, поскольку fputcsv избирательно относится к этому. Я пытался сделать что-то вроде этого:
Но когда файл открывается в текстовом редакторе Windows, он по-прежнему отображается как одна длинная строка.
+1 за выделение проблемы, с которой я столкнулся Mark Baker 03.11.2010
Вы включаете заголовок поля csv? ajreal 16.11.2010
При сравнении приведенного выше кода с принятым решением (при условии, что этот файл создается в Linux) создается впечатление, что исходная проблема могла заключаться в пересылке файла клиенту, а не обязательно в его создании. Например, загрузка исходного файла (с CR+LF EOL) через FTP в режиме ASCII из Linux в Windows могла привести к повреждению концов строк. MrWhite 25.10.2013
Это улучшенная версия отличного ответа @John Douthat, сохраняющая возможность использования настраиваемых разделителей и корпусов и возвращающая исходный вывод fputcsv:
Использование функции php fputcsv записывает только \n и не может быть настроено. Это делает функцию бесполезной для среды Microsoft, хотя некоторые пакеты также обнаруживают новую строку Linux.
Тем не менее преимущества fputcsv заставляли меня искать решение для замены символа новой строки непосредственно перед отправкой в файл. Это можно сделать, сначала передав fputcsv в сборку во временном потоке php. Затем адаптируйте символы новой строки к тому, что вы хотите, а затем сохраните в файл. Нравится:
function getcsvline($list, $seperator, $enclosure, $newline = "" ){
$fp = fopen('php://temp', 'r+');
fputcsv($fp, $list, $seperator, $enclosure );
rewind($fp);
$line = fgets($fp);
if( $newline and $newline != "\n" ) {
if( $line[strlen($line)-2] != "\r" and $line[strlen($line)-1] == "\n") {
$line = substr_replace($line,"",-1) . $newline;
} else {
// return the line as is (literal string)
//die( 'original csv line is already \r\n style' );
}
}
return $line;
}
/* to call the function with the array $row and save to file with filehandle $fp */
$line = getcsvline( $row, ",", "\"", "\r\n" );
fwrite( $fp, $line);
Ответ 3 · рейтинг 4 · Torge
Как указал webbiedave (спасибо!), вероятно, самый чистый способ - использовать потоковый фильтр.
Это немного сложнее, чем другие решения, но работает даже с потоками, которые нельзя редактировать после записи в них (например, загрузка с использованием $handle = fopen('php://output', 'w'); )
в качестве альтернативы вы можете вывести в собственном формате unix (только \n), а затем запустить unix2dos для полученного файла, чтобы преобразовать его в \r\n в соответствующих местах. Просто будьте осторожны, чтобы ваши данные не содержали \n. Кроме того, я вижу, что вы используете разделитель по умолчанию ~ . попробуйте разделитель по умолчанию \t .
Ответ 5 · рейтинг 1 · PPC-Coder
Я имел дело с похожей ситуацией. Вот решение, которое я нашел, которое выводит CSV-файлы с окончаниями строк, удобными для Windows.