web-dev-qa-db-fra.com

Écrire un fichier CSV dans un fichier sans boîtiers PHP

Existe-t-il une fonction native ou une classe/bibliothèque solide pour écrire un tableau sous forme de ligne dans un fichier CSV sans enceintes? fputcsv passera par défaut à " si rien n'est transmis pour le paramètre Enclosure. Google me manque (retourne des résultats pour tout un tas de pages sur fputcsv), et les bibliothèques de PEAR font plus ou moins les mêmes choses que fputcsv.

Quelque chose qui fonctionne exactement comme fputcsv, mais permettra aux champs de rester sans citation.

actuellement: "field 1","field 2",field3hasNoSpaces

désiré: field 1,field 2,field3hasNoSpaces

44
Derek Reynolds

Les avertissements concernant les enceintes précédentes sont valables, mais vous avez dit qu'ils ne s'appliquaient pas à votre cas d'utilisation.

Je me demande pourquoi vous ne pouvez pas simplement utiliser quelque chose comme ça?

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

fonctionne avec chr () function:

fputcsv($f,$array,',',chr(0));
14
Michal Wrd

fputcsv($file, $data, ';', chr(127));

5
Raul Duran

Ça ne marche pas?

fputcsv($fp, split(',', $line),',',' ');
2
Arthur Frankel

car(0) n'a pas fonctionné, car la valeur NULL étranglerait probablement la plupart des analyseurs au format csv.

J'ai fini par utiliser fputcsv() pour construire le fichier initial, puis j'ai supprimé et supprimé toutes les citations. Élégant? Peut-être pas, mais le travail a été fait :).

2
Derek Reynolds
<?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',
);
1
zeros-and-ones

J'utilise un moyen délicat pour supprimer les guillemets doubles, mais uniquement sous Linux

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

chr(0)a également travaillé pour moi:

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

L'inconvénient d'un fichier CSV sans pièce jointe signifie qu'une virgule erronée dans l'entrée de l'utilisateur modifiera la ligne. Vous devrez donc supprimer les virgules avant d'écrire une ligne CSV. 

La partie délicate de la gestion des fichiers CSV consiste à analyser les enceintes, ce qui rend les fonctions CSV PHP & PEAR utiles. Vous recherchez essentiellement un fichier délimité par des virgules pour les colonnes et délimité par des lignes pour les lignes. Voici un point de départ 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));

?>
0
leepowers

C’est ce que j’utilise pour mettre un fichier CSV standard dans un tableau ...

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;
} 

Vous pouvez ensuite sortir ce que vous voulez dans une boucle foreach.

0
jjclarkson