2010-03-25 13 views
7

estaba a punto de hacer las mismas preguntas que la cuestión entres aquí .... Forcing fputcsv to Use Enclosure For *all* Fieldsphp fputcsv y que encierran campos

La pregunta era

Cuando uso fputcsv para escribir una línea a 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, usted podría terminar con una línea como esto

11, "Bob", Jenkins, "200 Main St. EE.UU. ", etc

corto de añadir un espacio falsa a al final de cada campo, ¿hay alguna manera de forzar fputcsv para encerrar siempre columnas con el recinto (por defecto a un ") personaje?

La respuesta fue:

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 ninguna opción "siempre encerrar".

Necesito crear un archivo CSV en cada campo incluido ... ¿Cuál sería la mejor solución?

Gracias de antemano ...

+0

¿Cambiar las fuentes de php sería una opción? Es decir. está agregando alguna bandera "encierre siempre" a los parámetros de la función factibles en su caso? – VolkerK

Respuesta

7

rodar su propia función - no es difícil:

function dumbcsv($file_handle, $data_array, $enclosure, $field_sep, $record_sep) 
{ 
    dumbescape(false, $enclosure); 
    $data_array=array_map('dumbescape',$data_array); 
    return fputs($file_handle, 
     $enclosure 
     . implode($enclosure . $field_sep . $enclosure, $data_array) 
     . $enclosure . $record_sep); 
} 
function dumbescape($in, $enclosure=false) 
{ 
    static $enc; 
    if ($enclosure===false) { 
     return str_replace($enc, '\\' . $enc, $in); 
    } 
    $enc=$enclosure; 
} 

(anteriormente está usando el estilo Unix escape)

C.

+0

$ file_handle, $ data_array, $ enclosure, $ field_sep, $ record_sep - puedes dar un ejemplo de lo que se deben pasar los valores ... por favor ... gracias de antemano – Anudeep

+0

$ file_handle qué valor debe pasar para esta variable @symcbean – Anudeep

+0

return fputs ($ file_handle, $ enclosure . Implode ($ enclosure. $ Field_sep. $ Enclosure, $ data_array) . $ Enclosure. $ Record_sep); Recibo un error en esta línea Mensaje: Matriz a conversión de cadena – Anudeep

1

Una solución : Supongamos que tiene sus datos en una matriz bidimensional, puede agregar una cadena que forzará las cotizaciones y está seguro de que no está contenido en sus datos ("# @ @ #" aquí) y luego eliminará es:

$fp = fopen($filename, 'w'); 
    foreach ($data as $line => $row) { 
     foreach ($row as $key => $value) { 
      $row[$key] = $value."#@ @#"; 
     }   
     fputcsv($fp, $row); 
    } 

    fclose($fp); 
    $contents = file_get_contents($filename); 
    $contents = str_replace("#@ @#", "", $contents); 
    file_put_contents($filename, $contents);