2011-12-14 72 views
14

Quiero escribir algo comode escape y coma al escribir en el archivo csv

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

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

¿Algún ayuda?

Respuesta

16

El envoltorio con comillas dobles ya era la idea correcta, pero debe asegurarse de hacerlo correctamente. Puede poner una columna entre comillas dobles, y todo lo que está dentro se considera como un valor único. Las citas deben escaparse escribiendo dos de ellas ("").

Véase, 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 
3

También tuve un tiempo muy salvaje Tring para entender el cuadro completo, entonces es cómo Tengo toda mi csv listo para abrir en Excel en php (que incluye también 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); 
0

Uso esta función para que cada valor CSV pase correctamente. Cita un valor solo si contiene nuevos símbolos de línea, comillas dobles o separador. En realidad, el único valor para escapar es el símbolo de comillas dobles. El resto del contenido de celda entra y se muestra correctamente en Excel.

Comprobado con varias versiones de analizadores Excel y ODBC CSV en configuración 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, '/').']/', $str)){ 
     return '"'.str_replace('"', '""', $str).'"'; 
    } else 
     return $str; 
} 

Así que el uso puede ser así:

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