Estoy escribiendo una función para manejar la salida CSV usando fputcsv()
. He trabajado alrededor del temido problema \r\n
que mucha gente ha tenido con fputcsv()
(ver código).Al crear un archivo CSV, ¿cómo manejo los caracteres ny r en un campo?
Ahora estoy tratando de averiguar cómo manejar \r
o \n
caracteres que están incluidos en un campo (no el final de línea devuelve \r\n
). ¿Debería escapar de alguna manera antes de pasarse al fputcsv()
?
La función se encarga de escapar bien para la mayoría de los caracteres. Pero cuando se inserta un \n
en un campo, tanto MS Excel como Google Docs tienen problemas con el \n
y el CSV no se carga correctamente.
/*
* Revised Get CSV Line using PHP's fputcsv()
*
* Used to correct an issue with fputcsv()
* http://stackoverflow.com/questions/4080456/fputcsv-and-newline-codes
* MS Excel needs the MS Windows newline format of \r\n
*
*/
if (!function_exists('get_csv_line'))
{
function get_csv_line($list, $seperator = ",", $enclosure = '"', $newline = "\r\n")
{
$fp = fopen('php://temp', 'r+');
fputcsv($fp, $list, $seperator, $enclosure);
rewind($fp);
$line = fgets($fp);
if ($newline && $newline != "\n") {
if ($line[strlen($line)-2] != "\r" && $line[strlen($line)-1] == "\n") {
$line = substr_replace($line,"",-1) . $newline;
} else {
die('original csv line is already \r\n style');
}
}
if ($newline == "\r\n" && substr($line, -2) != "\r\n") {
log_message('error', 'function get_csv_line: Error, needs \r\n to be MS Excel friendly!');
}
return $line;
}
}
¿Debo simplemente reemplazar \ n y \ r dentro de los campos con un espacio? – jjwdesign
Pregunta relacionada: [¿Cómo generar un archivo CSV para Excel, cómo tener una nueva línea dentro de un valor?] (Http://stackoverflow.com/questions/1241220/generating-csv-file-for-excel-how-to-have- a-newline-inside-a-value) – Anne
He trabajado en algo como esto antes, CSV es algo terrible con lo que trabajar, incluso podría enfrentar problemas como campos que contengan su gabinete o símbolo de separación. Al final, tengo que elegir algunos caracteres de idiomas exóticos para esos símbolos, y ejecutar un script realmente largo para verificar esos \ n \ r y asegurarme de que haya suficientes caracteres de delimitación y separación. –