Pregunta

¿Existe una función nativa o una clase / biblioteca sólida para escribir una matriz como una línea en un archivo CSV sin recintos? fputcsv se establecerá de manera predeterminada en " si no se pasa nada para el parámetro del gabinete. Google me falla (devuelve resultados para un montón de páginas sobre fputcsv ), y las bibliotecas de PEAR hacen más o menos lo mismo que fputcsv .

Algo que funciona exactamente como fputcsv , pero permitirá que los campos permanezcan sin comillas.

actualmente: " campo 1 ", " campo 2 ", field3hasNoSpaces

deseado: campo 1, campo 2, field3hasNoSpaces

¿Fue útil?

Solución

Las advertencias sobre los anexos anteriores son válidas, pero ha dicho que no se aplican a su caso de uso.

Me pregunto por qué no puedes usar algo como esto.

<?php
$fields = array(
    "field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");

Otros consejos

funciona con la función chr () :

fputcsv($f,$array,',',chr(0));

fputcsv ($ archivo, $ datos, ';', chr (127));

¿No funciona esto?

fputcsv($fp, split(',', $line),',',' ');

Bueno, car (0) no funcionó ya que el valor NULL probablemente ahogará la mayoría de los analizadores csv.

Terminé usando fputcsv () para construir el archivo inicial, luego revisé y eliminé todas las comillas. ¿Elegante? Tal vez no, pero hizo el trabajo :).

<?php       

$filename = "sample.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, ['column 1','column 2']);
$data = ['sample','data'];

fputs($handle, implode($data,',')."\n");

// or

fwrite($handle, implode($data,',')."\n");

fclose($handle);
$headers = array(
    'Content-Type' => 'text/csv',
);

Utilizo una forma complicada de eliminar la comilla doble, pero solo en Linux

....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');

Esto es lo que uso para poner CSV estándar en una matriz ...

function csv_explode($delim=',', $str, $enclose='"', $preserve=false){
        $resArr = array();
        $n = 0;
        $expEncArr = explode($enclose, $str);
        foreach($expEncArr as $EncItem){
                if($n++%2){
                        array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:''));
                }else{
                        $expDelArr = explode($delim, $EncItem);
                        array_push($resArr, array_pop($resArr) . array_shift($expDelArr));
                        $resArr = array_merge($resArr, $expDelArr);
                }
        }
        return $resArr;
} 

Luego puede generar lo que quiera en un bucle foreach.

La desventaja de un archivo CSV sin gabinetes significa que una coma errante en la entrada del usuario bloqueará la fila. Por lo tanto, deberá eliminar comas antes de escribir una fila CSV.

La parte difícil con el manejo de CSV es analizar recintos, lo que hace que PHP & amp; PEAR CSV funciona valioso. Básicamente, está buscando un archivo delimitado por comas para columnas y delimitado por líneas nuevas para filas. Aquí hay un punto de partida simple:

<?php
$col_separator= ',';
$row_separator= "\n";

$a= array(
 array('my', 'values', 'are', 'awes,breakit,ome'),
 array('these', 'values', 'also', "rock\nAND\nROLL")
);

function encodeRow(array $a) {
 global $col_separator;
 global $row_separator;
 // Can't have the separators in the column data!
 $a2= array();
 foreach ($a as $v) {
  $a2[]= str_replace(array($col_separator, $row_separator), '', $v);
 }
 return implode($col_separator, $a2);
}

$output= array();
foreach ($a as $row) {
 $output[]= encodeRow($row);
}

echo(implode($row_separator, $output));

?>

chr(0) también funcionó para mí:

 fputcsv($fp, $aLine, $sDelimiter, chr(0));

Lo descubrí. Al pasar el código ASCII de Null a la función car () , parece funcionar bien.

fputcsv ($ f, $ array, $ delimiter, car (0))

¡Gracias por las respuestas a todos!

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