Pregunta

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

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

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

Aparte de agregar un espacio falso al final de cada campo, ¿hay alguna forma de forzar a fputcsv a encerrar siempre las columnas con el carácter encerrado (el valor predeterminado es ")?

¿Fue útil?

Solución

No, fputcsv () sólo 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 "siempre encierran" opción.

Otros consejos

No contentos con esta solución pero es lo que hice y funcionó. La idea es establecer un carbón más vacío carácter recinto en fputcsv y añadir algunas citas sobre cada elemento de la matriz.

function encodeFunc($value) {
    return "\"$value\"";
}

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));

Sobre la respuesta Martin 's, si se quiere evitar la inserción de cualquier carácter que no se derivan de la fuente array (Chr(127), Chr(0), etc), puede reemplazar la línea fputcsv () con el siguiente cambio:

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

Por supuesto, fputs () es más lento que fputcsv (), pero es una salida más limpia. El código completo es la siguiente:

/***
 * @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 una gran cantidad de scrafffing alrededor y un poco de carácter algo tedioso comprobar, tengo una versión de los códigos anteriormente referenciados por Diego y Mahn que se tira a cabo correctamente fundas y reemplazar con comillas dobles en todos los campos en fputcsv. y luego el archivo de salida al navegador para descargar.

También tenía un tema secundario de no poder estar seguros de que las comillas dobles eran siempre / nunca se escaparon.

Específicamente para cuando se emiten directamente a navegador usando el php: // flujo de entrada como referenciado por Diego. Chr(127) es un carácter de espacio por lo que el archivo CSV tiene unas cuantas más espacios que de otra forma, pero creo que esto deja de lado la cuestión de los caracteres NULL chr(0) 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top