2011-11-03 20 views
6

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; 
    } 
} 
+0

¿Debo simplemente reemplazar \ n y \ r dentro de los campos con un espacio? – jjwdesign

+3

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

+0

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. –

Respuesta

3

Si hay \ r o \ n dentro del campo sólo asegúrese de que todo el campo está rodeado por comillas dobles (y que las comillas dobles literales son de doble comillas dobles)

Así que para un resultado final de

value1,"so this is a 
multiline value",value2 

donde 'a' y 'multilínea' están separados ya sea por un \ no \ r (recuerda, \ r suele aparecer en Excel, pero está allí), entonces debería haber funcionado.

Si los valores \ n o \ r están incrustados en los valores que tiene en la matriz PHP, entonces ya debería estar encerrado adecuadamente.

0

Los archivos UTF que contienen una lista de materiales provocarán que Excel trate nuevas líneas literalmente, incluso en ese campo está rodeado por comillas. (Probado Excel 2008 Mac)

La solución es hacer que cualquier línea nueva sea un retorno de carro (CHR 13) en lugar de un avance de línea.

Cuestiones relacionadas