2010-09-28 76 views
10

Por lo tanto, mi código genera un archivo CSV utilizando la función incorporada de PHP fputcsv.Ajustar los valores CSV generados por PHP fputcsv() con ""

Para el delimitador, uso ',' (una coma).
Para el gabinete, uso '"' (una comilla doble).

Sin embargo, cuando intento algo así como

fputcsv($file,array('a','b',"long string, with commas",NULL,''),',','"'); 

emite

a,b,"long string, with commas",, 

pero me gustaría que la salida

"a","b","long string, with commas","","" 

¿Hay una manera fácil de hacer frente a este ¿O tendría que escribir un reemplazo para fputcsv?

+1

La salida es CSV válida. Tu otra herramienta está rota. –

+0

¿Por qué quieres las cotizaciones en cada campo? –

+1

@Ignacio, Andrew: Aparentemente, escondido en una pequeña esquina del diálogo de importación en el software de la hoja de cálculo, hay una opción para condensar múltiples campos vacíos ('a ,,,' => 'a,') y/o eliminarlos ('a ,,, '=>' a'). Y aparentemente algunos usuarios han verificado esto y no lo saben, por lo que la solución fácil y única para todos es forzar a cada campo vacío a ser una cadena vacía ('a," "," "," "') –

Respuesta

9

Esto no suele ser un problema para los archivos CSV.

fputcsv pone comillas alrededor del valor si sería ambiguo. Por ejemplo,

a,b,"long string, with commas",, 

no es ambigua, pero,

a,b,long string, with commas,, 

es y será en la mayoría (es decir: todos) de los casos ser interpretados por el lector CSV como tener más de 5 campos.

Los analizadores de CSV aceptarán literales de cadenas incluso sin comillas a su alrededor.

Si desea obtener comillas alrededor de los valores de todos modos, el siguiente fragmento lo haría. No se escapa cotizaciones dentro de la cadena - que el ejercicio se deja al lector:

$row = '"' . implode('", "', $rowitems) . '"'; 

usted quiere poner esto en un bucle para todas sus filas.

+0

Sí, sé sobre la ambigüedad, pero en realidad son las partes vacías que necesito entre comillas. Puedo vivir sin las partes no vacías envueltas (excepto las ambiguas, por supuesto). –

+0

Tu comentario es confuso. ¿Desea que las partes vacías se envuelvan entre comillas, pero las partes que no están vacías podrían pasar sin envolverse? ¿Qué quieres decir? El fragmento publicado incluirá todas las comillas que deberían funcionar con todos los analizadores de CSV. –

+0

No importa. Estaba un poco confundido. Sí, esto debería funcionar. Gracias. –

0

Cualquier razón por la que no pueda str_replace (',,', ', "",', $ output); ? También habría que ver si el último o el primer carácter es una coma y si es así, reemplace la coma ""

+0

Eso fue lo primero que pensé, pero luego tendría que interceptar el archivo: escribir en una cadena. D: –

+1

Ah sí. Olvidé completamente pensar en lo que realmente hace fputcsv. Es mejor que escriba su propia función que escapa de los datos y la genera usando fputs o fwrite. – methodin

2

Creo que la solución será así,

$order_header_arr = array("Item1", "Item2","This is Item3"); 
fputcsv($fp, $order_header_arr,',',' '); 

recordar " " [Espacio ] Entre el tercer parámetro de fputcsv

+0

Esa es la respuesta más limpia y rápida – RafaSashi

8

He solucionado esto insertando algunos caracteres de cadena falsos, con un espacio, # @ @ #, y luego quitándolos. Aquí hay un ejemplo de implementación:

//$exported is our array of data to export 
$filename = 'myfile.csv'; 
$fp = fopen($filename, 'w'); 
foreach ($exported as $line => $row) { 
    if ($line > 0) { 
     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); 

Esto encierra todos los campos entre comillas dobles, incluyendo los vacíos

+0

Aunque esto implica abrir y cerrar el archivo un tiempo adicional, funciona bien. – iamjonesy

+0

Esto también le permite configurarlo para un campo específico en lugar de todas las columnas +1 – input

+0

poco lento, pero la única forma de que esto funcione correctamente, ¡gracias! – Damian

0

fputcsv no encierre todas las variables de matriz entre comillas. Tener un valor de matriz numérica sin comillas puede ser correcto, pero presenta un problema cuando una etiqueta o programa de dirección encuentra un código postal numérico definido en los EE. UU. Porque borrará los ceros a la izquierda al imprimir. Por lo tanto, 05123-0019 se convierte en 5123-19.

Para adjuntar todos los valores, ya sea que existan o no, entre comillas, leo el archivo de entrada con fgetsrc y escribo una versión corregida usando fwrite. fgetsrc lee el registro en variables de matriz. Como fwrite escribe una variable, debe encadenar las variables de la matriz, adjuntarlas entre comillas y separar la variable de la matriz con una coma. A continuación, agregue el separador de registro.

<?php 
// fgetcsv - read array with fgetcsv and string into output variable 
// then write with fwrite 
// $ar is the array populated from fgetcsv and $arc is the variable strung 
// with array variables enclosed in quotes and written using fwrite. 
$file_in = fopen("reinOCp.csv","r") or die("Unable to open input file 
reinOCp.csv!"); 
$file_out = fopen("printLABEL.csv", "w") or die("Unable to open output file 
prtLABEL!"); 
while (!feof($file_in)) { //loop through each record of the input file 
    $ar=fgetcsv($file_in); //read the record into array $ar 
    if (is_array($ar)){ //this loop will string all the array values plus 
// the end of record into variable $arc and then write the variable 
     $arc = ""; //clear variable $arc 
     foreach ($ar as $value) {  
      $arc .= '"' . $value . '",'; // add the array values, enclose in 
// quotes with comma separator and store in variable $arc 
     } 
     $arc .= "\n"; //add end of record to variable $arc 
     fwrite($file_out, $arc) or die ("ERROR: Cannot write the file"); 
//write the record using variable $arc 
    } 
} 
echo "end of job"; 
fclose($file_in); 
fclose($file_out); 
?> 
Cuestiones relacionadas