escapar del carácter de punto y coma al escribir en un archivo csv

2 minutos de lectura

avatar de usuario
culo

Quiero escribir algo como

=HYPERLINK("http://example.com"; "Example")

a un archivo CSV separado por comas, pero Excel analiza el punto y coma y coloca la parte “Ejemplo”) en otra celda. Intenté escapar del punto y coma con una barra invertida y envolver todo entre comillas dobles sin suerte.

¿Alguna ayuda?

El envoltorio con comillas dobles ya era la idea correcta, pero debes asegurarte de hacerlo correctamente. Puede poner una columna entre comillas dobles, luego todo lo que está dentro se considera como un valor único. Las citas en sí tienen que escaparse escribiendo dos de ellas ("").

Ver por ejemplo esto:

Column A;Column B;Column C
Column A;"Column B; with semicolon";Column C
Column A;"Column B"";"" with semicolon and quotes";Column C
Column A;"=HYPERLINK(""http://example.com""; ""Example"")";Column C

También tuve un gran momento tratando de resolver la imagen completa, así es como tengo todo mi csv listo para abrirlo en Excel en php (que también incluye la codificación utf8):

$sep='";"';//note the separator is double quoted
while($t=mysql_fetch_assoc(mysql_query('select ..')){
  #replaces the caracters who are breaking csv display
  $t=array_map(function($x){return str_replace(array("\n","\r",'"'),array('\\n',"\\r",'""'),$x);},$t);
  $csv.="\n\"".implode($sep,$t)."\"";
}
$charset="utf-8";
header('Content-Type: application/csv;charset=".$charset);
header("Content-Disposition: attachment; filename="filename.csv"');
$bom=chr(239).chr(187).chr(191);#this tells excel document is utf8 encoded
die($bom.$csv);

avatar de usuario
Ilya Eliseev

Uso esta función para cada valor CSV para pasarlo correctamente. Cita un valor solo si contiene símbolos de nueva línea, comillas dobles o separadores. En realidad, el único valor para escapar es el símbolo de comillas dobles. Todo el resto del contenido de la celda ingresa y se muestra correctamente en Excel.

Comprobado con varias versiones de analizadores Excel y ODBC CSV en configuración regional cirílica en Windows.

/**
 * This function escapes single CSV value if it contains new line symbols, quotes or separator symbol and encodes it into specified $encoding.
 * 
 * @param string $source - origin string
 * @param string $sep - CSV separator
 * @param string $source_encoding - origin string encoding
 * @param string $encoding - destination encoding
 *
 * @return string - escaped string, ready to be added to CSV
 *
 * @example echo escapeStringCSV("Hello\r\n\"World\"!");
 *  will output
 *      "Hello
 *      ""World""!"
 */
function escapeStringCSV($source, $sep=';', $source_encoding='utf-8', $encoding="windows-1251//TRANSLIT"){

    $str = ($source_encoding!=$encoding ? iconv($source_encoding, $encoding, $source) :  $source);

    if(preg_match('/[\r\n"'.preg_quote($sep, "https://stackoverflow.com/").']/', $str)){
        return '"'.str_replace('"', '""', $str).'"';
    } else 
        return $str;
}

Entonces el uso puede ser así:

 while($row = mysql_fetch_assoc($res)){
    foreach($row as $val){
        $csv .= escapeStringCSV($val).';';
    }
    $csv .= "\r\n";
}  

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad