w3schools create php csv fputcsv

php - create - Obligar a fputcsv a usar el gabinete para*todos*campos



php import csv (4)

Cuando uso fputcsv para escribir una línea en un manejador de archivo abierto, PHP agregará un carácter adjunto a cualquier columna que crea que lo necesita, pero dejará otras columnas sin los adjuntos.

Por ejemplo, podrías terminar con una línea como esta

11,"Bob ",Jenkins,"200 main st. USA ",etc

A menos que se agregue un espacio falso al final de cada campo, ¿hay alguna forma de forzar a fputcsv a que siempre encierre columnas con el recinto (por defecto es un ") carácter?


Basándose en la respuesta de Martin , si desea evitar la inserción de caracteres que no provienen de la matriz fuente ( Chr(127) , Chr(0) , etc.), puede reemplazar la línea fputcsv () por la siguiente en su lugar :

fputs($fp, implode(",", array_map("encodeFunc", $row))."/r/n");

De acuerdo, fputs () es más lento que fputcsv (), pero es una salida más limpia. El código completo es así:

/*** * @param $value array * @return string array values enclosed in quotes every time. */ function encodeFunc($value) { ///remove any ESCAPED double quotes within string. $value = str_replace(''//"'',''"'',$value); //then force escape these same double quotes And Any UNESCAPED Ones. $value = str_replace(''"'',''/"'',$value); //force wrap value in quotes and return return ''"''.$value.''"''; } $fp = fopen("filename.csv", ''w''); foreach($table as $row){ fputs($fp, implode(",", array_map("encodeFunc", $row))."/r/n"); } fclose($fp);


Después de mucho scrafffing y algunas verificaciones de caracteres un tanto tediosas, tengo una versión de los códigos mencionados arriba por Diego y here que here correctamente las etiquetas y las reemplazará con comillas dobles en todos los campos en fputcsv . y luego muestra el archivo en el navegador para descargar.

También tuve un problema secundario de no poder estar seguro de que las comillas dobles siempre / nunca se escaparon.

Específicamente para cuando se envía directamente al navegador usando el flujo de entrada php: // como lo menciona Diego. Chr(127) es un carácter de espacio, por lo que el archivo CSV tiene algunos espacios más que lo contrario, pero creo que esto evita el problema de los caracteres chr(0) NULL en UTF-8.

/*** * @param $value array * @return string array values enclosed in quotes every time. */ function encodeFunc($value) { ///remove any ESCAPED double quotes within string. $value = str_replace(''//"'',''"'',$value); //then force escape these same double quotes And Any UNESCAPED Ones. $value = str_replace(''"'',''/"'',$value); //force wrap value in quotes and return return ''"''.$value.''"''; } $result = $array_Set_Of_DataBase_Results; $fp = fopen(''php://output'', ''w''); if ($fp && $result) { header(''Content-Type: text/csv''); header(''Content-Disposition: attachment; filename="export-''.date("d-m-Y").''.csv"''); foreach($result as $row) { fputcsv($fp, array_map("encodeFunc", $row), '','', chr(127)); } unset($result,$row); die; }

Espero que esto sea útil para alguien.


No estoy contento con esta solución pero es lo que hice y trabajé. La idea es establecer un char vacío como carácter de recinto en fputcsv y agregar algunas comillas en cada elemento de su matriz.

function encodeFunc($value) { return "/"$value/""; } fputcsv($handler, array_map(encodeFunc, $array), '','', chr(0));


No, fputcsv () solo encierra el campo bajo las siguientes condiciones

/* enclose a field that contains a delimiter, an enclosure character, or a newline */ if (FPUTCSV_FLD_CHK(delimiter) || FPUTCSV_FLD_CHK(enclosure) || FPUTCSV_FLD_CHK(escape_char) || FPUTCSV_FLD_CHK(''/n'') || FPUTCSV_FLD_CHK(''/r'') || FPUTCSV_FLD_CHK(''/t'') || FPUTCSV_FLD_CHK('' '') )

No hay una opción de "incluir siempre".